ГЛАВА IV
ТЕХНОЛОГИИ ВЗЛОМА
ПРОГРАММНЫХ ЗАЩИТ
Препятствование распространению информации об атаках приводит к опасной иллюзии безопасности…
Крис
Касперски. Техника и философия хакерских атак.
·
Способы обхода
защиты с помощью ключевого диска
·
Технология взлома
защит, основанных на ключевом сравнении
·
Уязвимость
криптографических систем защиты
Программист,
владеющий методами технической защиты, несомненно, должен знать технологии взлома
защит для того, чтобы, во-первых, не повторять ошибки существующих систем и,
во-вторых, создавать более эффективные и надежные механизмы. Автор защиты также
должен быть хорошо знаком с инструментарием современных взломщиков и учитывать
возможности существующих средств исследования программ (отладчиков,
дисассемблеров, просмотрщиков) при проектировании механизмов и систем защиты программного
обеспечения.
В этой главе
рассмотрим основные идеи, приемы, алгоритмы и технологии, позволяющие снимать,
обходить или взламывать программную защиту. А также дадим некоторые рекомендации по улучшению защитных
механизмов.
Способы обхода
защиты с помощью ключевого диска
Обойти защиту с
помощью ключевого диска можно несколькими способами. Самый простой способ - копирование ключевого диска.
Напомним, что большинство традиционных методов рассчитано на невозможность для
стандартной программы-копировщика создания копии ключевого диска. Однако наряду
со стандартными копировщиками существуют и специальные программы, которые
производят копирование диска методом "бит в бит" - так называемые побитовые
копировщики. При копировании такие программы не зависят от стандартных параметров
форматирования, то есть не проверяют ни общее число и нумерацию дорожек, ни
количество и нумерацию секторов на дорожке, ни другие особенности организации
диска. Они напрямую побитно воспроизводят одну дорожку за другой, игнорируя
неотформатированные дорожки. Таким образом, все методы, использующие
нестандартное форматирование ключевого диска, могут быть "обойдены" с
помощью побитовых копировщиков. В настоящее время доступна также и специальная
аппаратура для аналогового копирования дисков (например, платы для побитового
копирования).
Другой способ снятия защиты с помощью ключевого диска,
который может быть применен в том случае, если побитовый копировщик не
справляется с задачей создания копии диска, - моделирование обращений к ключевому диску.
Идея заключается
в имитации ключевого диска. Специальная программа-имитатор построена таким
образом, что, будучи резидентно запущенной во время работы защищенной программы,
с помощью подмены аппаратных прерываний возвращает на запросы защиты необходимые
ей (защите) коды завершения и ошибки.
С помощью
данного метода обычно снимают, например, защиту дисков с физическим повреждением
поверхности. Аналогичным моделированием обходят защиту дисков, содержащих
псевдосбойные кластеры. Например, чтением секторов диска можно предварительно
определить номера псевдосбойных кластеров, а далее создать программу-имитатор,
возвращающую механизму защиты необходимые номера секторов.
Традиционные механизмы защиты (подчеркнем, применяющиеся в
основном при работе под управлением операционной системы DOS)
могут быть взломаны также с помощью такого приема, как копирование программы из памяти. Идея данного приема
основана на том, что DOS “позволяет” копировать
содержимое оперативной памяти на диск.
Легким в реализации является механизм так называемой пристыковочной защиты. Данный механизм
основан на дополнении защищаемой программы специальным модулем, который
осуществляет все необходимые проверки, и в случае совпадения ответов с
эталонными передает управление основной программе. К сожалению, простота
реализации часто является критерием выбора автором механизма защиты, поэтому такой
тип защиты до сих пор широко распространен. Но пристыковочную защиту также
легко и снять, например, с помощью копирования программы из памяти. Для этого
достаточно дождаться момента, когда модуль защиты отработал и передал
управление основной программе. Очевидно, что в оперативной памяти в такой
момент находится исполняемый код программы уже без защиты. Теперь необходимо
получить дамп памяти (с помощью утилиты, сохраняющей содержимое оперативной
памяти на диск), а из него - код беззащитной программы.
Отметим, что
такой способ снятия защиты уже не сработает в случае так называемой встроенной защиты. При реализации
механизма встроенной защиты необходимо осуществлять проверки (например, ключевое
сравнение) не один раз до начала работы программы, а многократно в течение выполнения
программы.
Технология взлома защит, основанных на ключевом сравнении
Повторим,
абсолютное большинство используемых на практике защит основано именно на ключевом
сравнении. В самом деле, как нестандартные параметры форматирования и другие
параметры ключевых дисков, так и пароли, и регистрационные номера (коды), и
количество запусков программы, и время бесплатного использования программного
обеспечения, и счетчик установленных копий, и многие другие характеристики
являются по сути ключом защиты. И будучи введенными пользователем, обязательно подлежат
сравнению с хранящимся эталонным значением, то есть рассчитаны на ключевое
сравнение.
Для взлома
нарушителю прежде всего необходимо изучить код защищенной программы и понять логику
работы защитного механизма. Поэтому первый шаг взломщика - дисассемблирование
программы.
Заметим, что
среди неопытных программистов широко распространено заблуждение о том, что анализировать
алгоритм защиты - очень трудоемкая работа, потому что дисассемблер в результате
своей работы выдает огромные листинги, в которых практически невозможно разобраться.
Авторы, придерживающиеся такой точки зрения, часто для сравнения даже приводят
зависимость количества строк (десятки и сотни тысяч, миллионы), полученных
дисассемблированием программы, от количества строк самой программы.
Это серьезное заблуждение. Да, действительно, взлом
надежной защиты вообще трудоемкая работа, требующая высокой квалификации. Но
для изучения логики работы защитного механизма очень часто взломщику не
требуется разбираться во всем дисассемблированном коде. Существующие сегодня мощные
интерактивные[1]
дисассемблеры (лучшим из них сегодня считается IDA - Interactive DisAssembler) позволяют быстро находить защитные механизмы среди огромного
количества вызовов функций, множества переходов и других команд программы.
Идея способа отыскания защитного механизма заключается в
поиске строк, связанных с выводимыми запросами и сообщениями пользователю.
Например, в случае парольной защиты, таких, как «Введите пароль», «Пароль ОК»,
«Пароль неверный» и т.п. Очевидно, что так как сами строки-сообщения находятся
в сегменте данных, искать необходимо ссылки на такие строки. В подавляющем
большинстве случаев защитный механизм, сравнивающий введенный пароль с
эталонным, находится в окрестностях таких ссылок. А интерактивный дисассемблер
предоставляет взломщику достаточно средств для того, чтобы быстро и легко найти
эти ссылки.
Второй шаг взломщика - поиск команды сравнения ключа и
веток условного перехода.
Например, в случае парольной защиты ожидается примерно
следующий код:
call CheckPassword ; вызов процедуры проверки пароля
or ax,ax
jz PasswordOk ; если пароль правильный
; переход на метку PasswordOk
. . . ; команды, выполняющиеся в
случае
; неверного
пароля
PasswordOk
: . . . ;
основная часть программы
Достаточно условный переход JZ заменить на безусловный JMP для
того, чтобы программа начала воспринимать любой пароль в качестве правильного.
Это и есть знаменитая техника взлома заменой всего лишь одного (!) байта.
Удивительно, но
среди программистов распространено мнение, что хеширование пароля усиливает
защиту. Видимо, это заблуждение связано с тем, что, во-первых, сложные математические
вычисления затрудняют анализ кода программы, а, во-вторых, просмотром кода
отсутствующий в явном виде пароль найти не удается. На самом деле, в таком
случае взломщику опять-таки нет нужды кропотливо разбираться во всем защитном
механизме и тем более в математических вычислениях, достаточно найти «заветную»
команду сравнения и условный переход заменить на безусловный (по-прежнему всего
лишь один байт). Отличие в реализации такой защиты только в том, что теперь в
программе сравнивается не введенный пароль с оригинальным, а результаты
хеширования оригинального пароля и введенного. Кстати, то же можно сказать и о
широко распространенных реализациях защиты с помощью шифрования пароля. Очевидно,
что в любом варианте реализации защиты шифрованием пароля обязательно будет присутствовать
команда сравнения: либо введенный пароль зашифровывается и сравнивается с хранящимся
в зашифрованном виде эталоном, либо зашифрованный эталон дешифруется и
сравнивается с паролем пользователя.
Заметим, что современные версии интерактивных дисасемблеров
позволяют вести контекстный поиск. Опытному взломщику достаточно правильно
выбрать и указать маску для поиска, чтобы сразу локализовать защитный механизм программы.
Например, взломщики используют маску, включающую сигнатуру известной последовательности
команд
call ? ; or ax,ax; j?
плюс смещения (ссылки) на
строки сообщений типа «Пароль неверный». Кроме того, язык запросов современных версий дисассемблеров для контекстного
поиска, наряду с обозначениями «произвольный символ» и «любое количество
произвольных символов», содержит
обозначение «любое количество произвольных команд» (например, «; ;» в HIEW),
что, очевидно, облегчает работу взломщика.
! |
Из всего сказанного следует, что для усиления защиты необходимо
1)
затруднить
поиск среди кодов программы защитного механизма;
2)
по
возможности отказаться от прямого сравнения параметра с эталоном с помощью
команд сравнения.
Затруднить поиск защитного
механизма
можно многими способами. Перечислим некоторые рекомендации.
* Строки сообщений типа
«Верный пароль», «Введите регистрационный номер», которые в первую очередь
будет искать злоумышленник, лучше генерировать динамически либо зашифровать.
* Не следует оформлять
защитный механизм в виде отдельного модуля, процедуры или функции. Обращение из
основной программы к такому механизму легко будет найти взломщику. Специалисты
рекомендуют разносить код механизма защиты по всей программе, обращаться к различным
процедурам, использовать недокументированные функции. Еще один совет - активно
использовать глобальные переменные.
* Можно контролировать
целостность критических фрагментов программы с помощью вычислений контрольных
сумм, причем делать это не однократно, а из различных мест программы.
* При правильной реализации
хороший эффект дает шифрование защитного механизма.
* И хотя антиотладочные приемы
бессильны против современных отладчиков, желательно все же усложнить взлом
программы использованием антиотладочных приемов. В любом случае взломщику
понадобится время на то, чтобы их «снять».
* Простое увеличение кода
также способствует усложнению поиска защитного механизма. Для запутывания
взломщика (неопытного) можно дополнять программу участками кода, на которые никогда
не передается управление. При этом желательно включить в эти участки
«интересные» запутывающие команды и сообщения, то есть максимально усложнить
работу взломщику.
* Некоторые авторы защит
используют подмену адресов прерываний. Например, копируют некоторый вектор в
любой другой (менее интересный для взломщика), а затем обращаются по новому адресу.
Существуют и другие способы
затруднения анализа программы, Подчеркнем, что все они, как правило, связаны с
использованием оригинальных приемов программирования.
Отказаться от прямых команд сравнения и явных условных
переходов можно:
· использованием в вычислениях
значений, полученных от ключа;
· использованием скрытых
переходов или
· использованием переходов по
адресам, вычисляемым как некоторые функции оригинального параметра (можно
рассматривать параметр как индекс в таблице переходов);
· можно попытаться обмануть
взломщика использованием наряду с явными сравнениями «скрытых» сравнений.
Ожидается, что первоначально будут вскрыты явные сравнения.
_______________________________
Затруднить поиск
защитного механизма можно также применяя нестандартную
реализацию команд или путем
замены команд на эквивалентные.
! |
Необходимо обратить внимание
на то, что все рекомендуемые способы только усложняют взлом программы или
увеличивают время, необходимое на «снятие» защиты, то есть увеличивают
трудозатраты взломщика (в зависимости от степени его квалификации).
Уязвимость
криптографических систем защиты
В настоящее время широко распространены методы защиты
программного обеспечения, основанные на использовании криптографических
алгоритмов. По поводу эффективности защиты такого класса хочется привести
мнение Криса Касперски, автора книги «Техника и философия хакерских атак»: «Эти
защиты выглядят неломаемыми. «Выглядят» потому, что разработчики не учитывают
разницу между теоретическими моделями и практической реализацией... очень
многие используемые криптосистемы ненадежны, и практически все в той или иной
степени уязвимы»[20, стр. 30].
Наиболее распространенная ошибка начинающих авторов -
дешифрование кода защищаемой программы целиком перед началом работы основной
программы и шифрование перед завершением работы программы. Для снятия такой
защиты достаточно получить дамп памяти в момент после дешифрования исполняемого
кода программы и произвести анализ полученных кодов.
Хранящийся в зашифрованном виде пароль (ключ), очевидно,
также на некотором этапе подвергается дешифрованию. С помощью отладчика легко
можно получить оригинальный пароль в момент после его дешифрования.
Поэтому для усиления защиты, основанной на шифровании кода
программы или пароля, можно прежде всего рекомендовать следующие приемы.
* Поблочное дешифрование.
Расшифровывание кода программы следует производить поэтапно, часть за частью,
добиваясь того, чтобы полностью в открытом виде исполняемый код никогда бы не находился
в памяти.
* Шифрование с обратной
связью. Необходимо реализовать схему, в которой ключ для дешифрования
фрагментов кода изменяется динамически и зависит от ранее полученных значений
или условий, например, вычисляется как функция от предыдущего блока (возможны
варианты).
* Использовать контрольную
сумму исполняемого кода для расшифровки фрагмента кода.
* Специалисты предлагают часть
механизма защиты оформить в виде резидентного модуля, в задачу которого могут
входить, например, запрещение записи на диск в течение некоторого времени или
контроль сегментных регистров на предмет изменения. При этом желательно
организовать защиту так, чтобы коды защитного механизма всегда попадали в дамп
вместе с кодами основной программы.
* Комбинирование
криптографических методов со сжатием. В этом случае копию расшифрованного участка
нельзя будет вписать на то же место.
______________________________
Остановимся на
технике взлома излюбленного программистами приема - шифрования с помощью операции
XOR. Считается, что стойкость механизма такой защиты определяется выбором
ключа. То есть авторы стремятся придумать «поинтереснее» ключ, да «спрятать»
его получше. На самом деле это бессмысленно. Так как защита достаточно просто
вскрывается атакой по открытому тексту.
Метод взлома базируется на специфике операции XOR. Напомним. Text xor
Key = Shifr
Shifr xor
Key = Text
Теперь следует учесть, что и
Shifr xor
Text = Key.
То есть знание открытого
(исходного) текста позволяет определить ключ шифрования. (Заметьте, что для нахождения
восьмибитового ключа достаточно знать один (!) байт открытого текста.) При
взломе защиты программы у нарушителя есть преимущество: он может исходить из
предположения, что некоторая последовательность байтов встречается в открытом
тексте. Диапазон для проверки очень широк - могут быть использованы и строковые
сообщения, например, Ok, Copyright и т.п., и символ возврата
каретки, и команды вызова прерываний и многое-многое другое.
______________________________
Специалистами достаточно изучены вопросы ненадежности
криптографических систем защиты. Перечислим причины ненадежности криптосистем [24].
1.
Невозможность
применения стойких криптоалгоритмов.
Факторами,
обусловливающими этот факт, являются:
· малая скорость стойких
криптоалгоритмов;
· экспортные ограничения.
Например, из США запрещен экспорт криптоалгоритмов с длиной ключа более 40 бит,
но криптоалгоритм с такой длиной ключа не может обеспечить даже минимальной
надежности;
· использование собственных
криптоалгоритмов. Мы уже отмечали причины слабости собственных криптоалгоритмов.
2.
Неправильная
реализация криптоалгоритмов.
Примерами
неправильной реализации являются следующие ошибки.
· Уменьшение криптостойкости
при генерации ключа. Здесь имеются в виду механизмы, в которых система защиты
либо обрезает пароль пользователя, либо генерирует из него ключ, имеющий меньшую
длину.
· Отсутствие проверки на
слабые ключи. Для многих криптоалгоритмов существуют так называемые слабые
ключи, при использовании которых криптоалгоритм не обладает достаточной мощностью.
! |
Необходимо
осуществлять проверки на слабые ключи.
· Недостаточная защищенность
от так называемых разрушающих программных средств, то есть программ, способных
перехватить секретный ключ или нешифрованные данные и даже подменить криптоалгоритм.
· Наличие зависимости во
времени обработки ключей. Речь идет о том, что криптосистема может обрабатывать
разные входные данные (ключ и/или непосредственно шифруемые данные) в течение
неодинаковых промежутков времени. Взломщик, измеряя время обработки различных
данных, имеет возможность подбирать ключ.
· Ошибки в программной
реализации. (Закон Мерфи гласит: каждая программа имеет хотя бы одну ошибку.)
· Наличие люков. Как и в любой
программе, люки в системе защиты могут быть умышленно либо случайно оставлены
разработчиком.
· Недостатки датчика случайных
чисел. Для создания ключа авторы защит часто используют датчик псевдослучайных
чисел. На стойкость механизма в этом случае влияют инициализации датчика, малый
период и плохой разброс генерируемых чисел.
! |
Специалисты не рекомендуют использовать
собственный датчик случайных чисел. Иначе по крайней мере инициализация датчика
должна зависеть от физических величин. Рекомендуется для генерации случайных
чисел использовать аппаратное устройство, например, специальную плату.
3.
Неправильное
применение криптоалгоритмов.
· Малая длина ключа.
· Хранение ключа вместе с
данными.
4.
Человеческий
фактор.
Как и в любой
системе, ошибки человека-пользователя являются самыми распространенными. Например,
выбор пользователем короткого или осмысленного пароля самый криптостойкий
алгоритм сведет к нулю.
|
Итак, при проектировании и
реализации систем, использующих криптографическую защиту, следует учитывать
перечисленные факторы, обусловливающие недостаточную надежность механизмов защиты,
а также избегать ошибок реализации.
Теперь
остановимся на радикальном способе вскрытия ключа шифрования или пароля.
Предположим, что автор избежал распространенных ошибок
реализации и не предоставил в распоряжение взломщика ни ключ (пароль) в
открытом виде, ни команды сравнения и явные условные переходы. Кроме того,
пароль выбран по всем правилам и не поддается подбору «вручную». В этом случае
взломщик будет пытаться использовать перебор
всех возможных паролей.
Еще несколько лет назад мощность компьютеров делала
возможными заявления авторов защит о том, что полный перебор паролей/ключей
шифрования невозможен по причине огромного количества возможных паролей/ключей.
Еще и сейчас для демонстрации эффективности системы защиты приводят мощность
множества ключей (паролей), а надежность подтверждают длиной ключа.
«По оценке Брюса
Шнайера, для атаки на ключ длиной 128 бит необходимо наличие 4,2 x 1022
процессоров производительностью 256 миллионов операций шифрования в секунду. В
этом случае ключ будет взломан за 1 год. Стоимость такого количества процессоров
к 2000 г. оценивается в 3,5 x 1024 долл.» [25].
«Метод RSA
абсолютно надежен. Даже при использовании MailSafe (продукт, основанный на
технологии RSA) в режиме самого нижнего уровня секретности, для
«взламывания» шифра понадобится около 10 лет работы суперкомпьютера Gray-1.
Если необходимо достичь высокого уровня секретности, MailSafe может применить вместо
400-битового, 700-битовый ключ. Это замедлит процесс шифрования в 5 раз, а
дешифрования на Gray (по методу проб и ошибок) - 36 миллионов лет» [26].
Но современные
мощности компьютеров и новейшие технологии вычислений, например, с помощью
кластеризации компьютеров, позволяют осуществлять полный перебор даже достаточно
длинных паролей в течение приемлемого промежутка времени[2].
Широко известны
эксперименты со взломом знаменитого криптографического стандарта США - DES-алгоритма
(Data Encryption Standart).
56-битный ключ DES-алгоритма был невскрываем около двадцати лет. «...
он пал 17 июня 1997 г., через 140 дней после начала конкурса (при этом было
протестировано около 25% всех возможных ключей и затрачено ≈ 450 MIPS-лет[3]»
[24]. В 1998 году появилось сообщение о взломе DES-алгоритма за 56 часов [19].
С резким скачком
производительности вычислительной техники сначала столкнулся алгоритм RSA, для
вскрытия которого необходимо решать задачу факторизации. В марте 1994 была закончена
длившаяся в течение 8 месяцев факторизация числа из 129 цифр (428 бит6). Для
этого было задействовано 600 добровольцев и 1600 машин, связанных посредством
электронной почты. Затраченное машинное время было эквивалентно примерно 5000
MIPS-лет [24].
29 января 1997
фирмой RSA Labs был объявлен конкурс на вскрытие симметричного алгоритма RC5.
40-битный ключ был вскрыт через 3.5 часа после начала конкурса! (Для этого даже
не потребовалась связывать компьютеры через Интернет - хватило локальной сети
из 250 машин в Берклевском университете). Через 313 часов был вскрыт и
48-битный ключ [ 24].
Написать
программу, строящую все возможные последовательности символов из заданного последовательного
перечислимого множества, может даже начинающий программист. Очевидно, что расчет
автора защиты должен быть основан на том, чтобы полный перебор занял промежуток
времени, выходящий за рамки разумного. И первое, что используют для этого разработчики,
- увеличение длины ключа (пароля). По-своему они правы. Но
Во-первых, как
уже отмечалось, растут мощности компьютеров, и, если на полный перебор еще
вчера требовался большой промежуток времени, то время, которое потребуется компьютеру
завтра, вероятнее всего, будет уже приемлемым для снятия защиты.
С связи с резким
ростом вычислительных мощностей атаки полным перебором имеют гораздо больше
шансов на успех, чем раньше. Если для системы UNIX функция crypt(), которая
отвечает за хеширование паролей, была реализована так, что выполнялась почти 1
секунду на машину класса PDP, то за двадцать лет скорость ее вычисления
увеличилась в 10000 раз (!). Поэтому если раньше хакеры (и разработчики,
которые ограничили длину пароля 8 символами) и представить себе не могли полный
перебор, то сегодня такая атака в среднем приведет к успеху за 125 дней [24].
Во-вторых, для
увеличения скорости перебора уже предложены и могут быть усовершенствованы эффективные
алгоритмы (как правило, основанные на формальной логике и использующие теорию
множеств, теорию вероятностей и другие области математики). Кроме этого,
применяются и алгоритмы быстрого поиска. (Например, для атаки на RSA и
подобные системы предлагается использовать самоорганизующийся табличный поиск.)
Более того, уже
создана специальная аппаратура, выполняющая функции перебора.
Важно отметить,
что хранение хеш-функции пароля не исключает возможности полного перебора, а
только изменяет необходимое для взлома время. В самом деле, теперь программу,
осуществляющую перебор паролей, необходимо дополнить вычислением хеш-функции
каждого варианта и сравнивать результат с хеш-эталоном.
Обратим внимание
на еще одно обстоятельство, связанное с защитой на основе хеширования пароля.
Некоторые хеш-функции могут возвращать результат, совпадающий с оригиналом, и
для неверного пароля. Для снятия защиты
в данном случае достаточно найти любой подходящий пароль, что, очевидно,
ослабляет защиту, снижает затраты на взлом. (Таким свойством обладают
хеш-функции, дающие результат, сравнимый по длине (в битах) с паролем.)
Остановимся еще
на разновидности техники полного перебора паролей - так называемой атаке по словарю. Это метод, с
помощью которого можно вскрыть осмысленный пароль. Метод основан на том, что
пользователь для более легкого запоминания выбирает существующее в некотором
языке (словарное) слово. Если учесть, что в любом языке не более 100.000 слов,
очевидно, что полный перебор словарных слов произойдет в течение небольшого
промежутка времени.
Сейчас широко
распространены программы, подбирающие пароли на основе словарных слов. Теперь
только безответственный или ленивый пользователь может остановиться на осмысленном
пароле. Напомним, что, кроме проверки по словарю, такие программы «умеют» изменять
регистры символов, «знают» знаки препинания, «догадываются», что пользователь может
перевернуть слово, склеить два слова с помощью знака препинания или цифры и
т.п. преобразования.
Примечательно,
что современные развитые средства защиты от несанкционированного доступа, предоставляющие
пользователю самостоятельно выбирать пароль для доступа, снабжены модулями,
осуществляющими проверку выбранного пароля на принадлежность к такого рода
словарям и не допускающими в таком случае пароль к применению.
Программы,
осуществляющие атаку по словарю, достаточно быстро работают, так как реализовывают
эффективные алгоритмы поиска и сравнения. Например, используют не медленное
сравнение строк, а сравнение контрольных сумм и т.п. Многие из них даже не
содержат базу слов, а пользуются встроенными в распространенные текстовые
редакторы словарями.
_____________________________
Сделаем выводы и
дадим некоторые рекомендации по усилению защиты.
* Защиту паролем следует
применять в тех случаях, когда либо атака методом перебора будет неэффективной,
либо злоумышленнику заведомо не будут доступны достаточно мощные вычислительные
средства для осуществления полного перебора (нельзя забывать о возможности
использования сетевых технологий).
* Для усиления парольной
защиты следует применять любые оригинальные приемы, уменьшающие скорость
перебора паролей.
* Немного усилить парольную
защиту можно, осуществляя в программе две (зависимые) проверки: и пароля, и
результата хеш-функции пароля, при этом на должном уровня «спрятав» защитный
механизм, или, как минимум, отказавшись от прямого сравнения. При этом желательно
специально выбрать хеш-функцию, дающую большое количество подходящих под
хеш-эталон паролей. При такой реализации защитного механизма взломщику
необходимо будет атаковать два параметра.
* Еще эффективнее работает
защита, если пароль (а лучше функция пароля) служит ключом шифрования некоторой
части кода программы. В этом случае взломщику после перебора всех возможных
паролей (дающих заданный результат хеширования) придется еще дешифровать код.
! |
Заметим, что в
таком варианте защиты, то есть при одновременной проверке нескольких параметров,
хеш-функция, дающая требуемый результат для большого количества паролей,
значительно усложняет взлом.
___________________________________________________________
Подробнее
1.
Примеры
атак на механизмы защиты - Крис Касперски «Техника и философия хакерских атак» [20].
2.
Генерирование
псевдослучайных последовательностей чисел - Ю.С. Харин, В.И. Берник, Г.В. Матвеев
«Математические основы криптологии» [21], стр. 153-188; В. Жельников
«Криптография от папируса до компьютера» [22], стр. 181-207.
[1] Интерактивный дисассемблер - программа, тесно взаимодействующая с пользователем в процессе дисассемблирования.
[2] Заметим, что примеры, приведенные ниже, предназначены для демонстрации увеличивающихся мощностей компьютеров, но это не означает, что ключи шифрования были вскрыты обязательно методом полного перебора.
[3] MIPS - million instructions per second (миллион инструкций в секунду в течение года)