Вы находитесь на странице: 1из 20

ЛАБОРАТОРНАЯ РАБОТА №6.

ЗАЩИТА ИНФОРМАЦИИ В СЕТИ ИНТЕРНЕТ

Оглавление
1. Теоретические сведения....................................................................2
1.1. Хеш-функции...............................................................................................................................2
1.1.1.Понятие хеш-функции.......................................................................................................2
1.1.2. Что такое хеш-функция..................................................................................................2
1.1.3. Область использования хеш-функций.............................................................................4
1.1.4. Хеш-функции помогают ловить вирусы.........................................................................5
1.1.5. Криптографические хеш-функции..................................................................................6
1.1.6. Хеширование пароля.........................................................................................................9
1.1.7. Соленое хеширование пароля.........................................................................................12
1.1.8. Коллизии хеш-функций....................................................................................................12
1.1.9. Основные правила безопасного хеширования паролей...............................................13
1.1.10. Хеш-код в веб-приложениях.........................................................................................14
1.1.11. Медленные хеш-функции – растяжение ключа.........................................................15
1.1.12. Имитовставка и аппаратное хеширование паролей................................................16
1.1.13. Другие методы защиты...............................................................................................17
2. Практическая часть.........................................................................18
2.1. Порядок выполнения задания..................................................................................................18
2.2. Практические задания...............................................................................................................18
2.3. Вопросы по разделу..................................................................................................................19
2.4. Порядок отчетности и форма контроля выполнения работы..............................................21

~1~
Лабораторная работа №6.
ЗАЩИТА ИНФОРМАЦИИ В СЕТИ ИНТЕРНЕТ
1. Теоретические сведения
Цель работы: Ознакомиться с возможностями защиты конфиденциальной
информации в сети интернет, изучить особенности и принципы функционирования и
хранения данных в сети Интернет.

1.1. Хеш-функции

1.1.1.Понятие хеш-функции

Хеш-функцией (hash function) называется математическая или иная функция,


которая для строки произвольной длины вычисляет некоторое целое значение или
некоторую другую строку фиксированной длины. Математически это можно записать
так:
H = H(M),
где М – исходное сообщение, называемое иногда прообразом, а h – результат,
называемый значением хеш-функции (а также хеш-кодом или дайджестом
сообщения (от англ. message digest )).
Смысл хеш-функции состоит в определении характерного признака прообраза –
значения хеш-функции. Это значение обычно имеет определенный фиксированный
размер, например, 64 или 128 бит. Хеш-код может быть в дальнейшем
проанализирован для решения какой-либо задачи. Так, например,
хеширование может применяться для сравнения данных: если у двух массивов
данных хеш-коды разные, массивы гарантированно различаются; если одинаковые —
массивы, скорее всего, одинаковы.
В общем случае однозначного соответствия между исходными данными и хеш-
кодом нет из-за того, что количество значений хеш-функций всегда меньше, чем
вариантов входных данных. Следовательно, существует множество входных
сообщений, дающих одинаковые хеш-коды (такие ситуации
называются коллизиями). 
Вероятность возникновения коллизий играет немаловажную роль в оценке
качества хеш-функций. Хеш-функции широко применяются в современной
криптографии.

1.1.2. Что такое хеш-функция

Хеш-функцией называется односторонняя функция, предназначенная для


получения дайджеста или «отпечатков пальцев» файла, сообщения или некоторого
блока данных.
Криптографические хеш-функции — незаменимый и повсеместно
распространенный инструмент, используемый для выполнения целого ряда задач,
включая аутентификацию, проверку целостности данных, защиту файлов и даже
обнаружение зловредного ПО.
Существует масса алгоритмов хеширования, отличающихся криптостойкостью,
сложностью, разрядностью и другими свойствами.
Считается, что идея хеширования принадлежит сотруднику IBM, появилась
около 50 лет назад и с тех пор не претерпела принципиальных изменений. Зато в
~2~
наши дни хеширование обрело массу новых свойств и используется в очень многих
областях информационных технологий.
Что такое хеш? Если коротко, то криптографическая хеш-функция, чаще
называемая просто хешем, — это математический алгоритм, преобразовывающий
произвольный массив данных в состоящую из букв и цифр строку фиксированной
длины. Причем при условии использования того же типа хеша длина эта будет
оставаться неизменной, вне зависимости от объема вводных данных.
Криптостойкой хеш-функция может быть только в том случае, если
выполняются главные требования: стойкость к восстановлению хешируемых данных
и стойкость к коллизиям, то есть образованию из двух разных массивов данных двух
одинаковых значений хеша.
Интересно, что под данные требования формально не подпадает ни один из
существующих алгоритмов, поскольку нахождение обратного хешу значения —
вопрос лишь вычислительных мощностей. По факту же в случае с некоторыми особо
продвинутыми алгоритмами этот процесс может занимать чудовищно много времени.

Как работает хеш ? Например, распространенное имя — Brian — после


преобразования хеш-функцией SHA-1 (одной из самых распространенных наряду с
MD5 и SHA-2) при помощи онлайн-генератора будет выглядеть так:
75c450c3f963befb912ee79f0b63e563652780f0.

Если взять похожее слово brain (мозг) и снова воспользоваться алгоритмом


SHA-1, то слово Brain трансформируется в строку:
97fb724268c2de1e6432d3816239463a6aaf8450.

Как видите, результаты значительно отличаются друг от друга, даже несмотря на


то, что разница между словами заключается лишь в последовательности написания
двух гласных.
Более того, если преобразовать тем же алгоритмом собственное имя, но
написанное уже со строчной буквы, то результат все равно не будет иметь ничего
общего с двумя предыдущими:
760e7dab2836853c63805033e514668301fa9c47.

Впрочем, кое-что общее у них все же есть: каждая строка имеет длину ровно 40
символов. Кроме того, если вы захешируете весь предыдущий абзац целиком, то все
равно получите последовательность, состоящую ровно из 40 символов:
c5e7346089419bb4ab47aaa61ef3755d122826e2.
То есть 1128 символов, включая пробелы, были ужаты до строки той же длины,
что и пятибуквенное слово. То же самое произойдет даже с полным собранием
сочинений Уильяма Шекспира: на выходе вы получите строку из 40 букв и цифр. При
всем этом не может существовать двух разных массивов данных, которые
преобразовывались бы в одинаковый хеш. Рассмотрим еще несколько показательных
примеров хеширования.
Для наглядности, представим результаты нашего хеширования в виде схемы
(рис. 15).

~3~
Рис. 15. Примеры хеширования

1.1.3. Область использования хеш-функций.

Для простых пользователей, наиболее распространенная область применения


хеширования это хранение паролей. К примеру, если вы забыли пароль к какому-
либо онлайн-сервису, скорее всего, придется воспользоваться функцией
восстановления пароля.
В этом случае вы, впрочем, не получите свой старый пароль, поскольку онлайн-
сервис на самом деле не хранит пользовательские пароли в виде обычного текста.
Вместо этого он хранит их в виде хеш-значений. То есть даже сам сервис не может
знать, как в действительности выглядит ваш пароль. Исключение составляют только
те случаи, когда пароль очень прост и его хеш-значение широко известно в кругах
взломщиков.
Таким образом, если вы, воспользовавшись функцией восстановления, вдруг
получили старый пароль в открытом виде, то можете быть уверены: используемый
вами сервис не хеширует пользовательские пароли, что очень плохо.
Вы даже можете провести простой эксперимент: попробуйте при
помощи специального сайта произвести преобразование какого-нибудь простого
пароля вроде «123456» или «password» из их хеш-значений (созданных алгоритмом
MD5) обратно в текст.
Вероятность того, что в базе хешей найдутся данные о введенных вами простых
паролях, очень высока. В нашем случае хеши слов «brain» и «Brian» успешно
распознались. Отличный пример, как раз для тех, кто все еще использует простые
пароли.
Еще один пример, покруче. Не так давно по тематическим сайтам прокатилась
новость о том, что популярный облачный сервис Dropbox заблокировал одного из
своих пользователей за распространение контента, защищенного авторскими
правами. Герой истории тут же написал об этом в твиттере, запустив волну
негодования среди пользователей сервиса, ринувшихся обвинять Dropbox в том, что
он якобы позволяет себе просматривать содержимое клиентских аккаунтов, хотя не
имеет права этого делать.
Впрочем, необходимости в этом все равно не было. Дело в том, что владелец
защищенного копирайтом контента имел на руках хеш-коды определенных аудио- и
видеофайлов, запрещенных к распространению, и занес их в черный список хешей.

~4~
Когда пользователь предпринял попытку незаконно распространить некий контент,
автоматические сканеры Dropbox засекли файлы, чьи хеши оказались в пресловутом
списке, и заблокировали возможность их распространения.
Где еще можно использовать хеш-функции помимо систем хранения паролей и
защиты медиафайлов? На самом деле задач, где используется хеширование,
достаточно много. Однако есть еще одна особенная область применения хешей, они
широко используются для детектирования вирусных программ, но об этом в
следующем разделе.

1.1.4. Хеш-функции помогают ловить вирусы

Примерно так же, как звукозаписывающие лейблы и кинопрокатные компании


защищают свой контент, сообщество создает черные списки вирусов (многие из них
доступны публично), а точнее, списки их хешей. Причем это может быть хеш не
всего вируса целиком, а лишь какого-либо его специфического и хорошо узнаваемого
компонента.
С одной стороны, это позволяет пользователю, обнаружившему подозрительный
файл, тут же внести его хеш-код в одну из подобных открытых баз данных и
проверить, не является ли файл вредоносным. С другой — то же самое может сделать
и антивирусная программа, чей «движок» использует данный
метод детектирования наряду с другими, более сложными.
Криптографические хеш-функции также могут использоваться для защиты от
фальсификации передаваемой информации. Иными словами, вы можете
удостовериться в том, что файл по пути куда-либо не претерпел никаких изменений,
сравнив его хеши, снятые непосредственно перед отправкой и сразу после получения.
Если данные были изменены даже всего на 1 байт, хеш-коды будут отличаться,
как мы уже убедились в самом начале статьи. Недостаток такого подхода лишь в том,
что криптографическое хеширование требует больше вычислительных мощностей
или времени на вычисление, чем алгоритмы с отсутствием криптостойкости. Зато они
в разы надежнее.
Кстати, в повседневной жизни мы, сами того не подозревая, иногда пользуемся
простейшими хешами. Например, представьте, что вы совершаете переезд и
упаковали все вещи по коробкам и ящикам. Погрузив их в грузовик, вы фиксируете
количество багажных мест (то есть, по сути, количество коробок) и запоминаете это
значение. По окончании выгрузки на новом месте, вместо того чтобы проверять
наличие каждой коробки по списку, достаточно будет просто пересчитать их и
сравнить получившееся значение с тем, что вы запомнили раньше. Если значения
совпали, значит, ни одна коробка не потерялась.

1.1.5. Криптографические хеш-функции

Хеш-код создается функцией Н: h = H (M), где М является сообщением


произвольной длины и h является хеш-кодом фиксированной длины.
Криптографической хеш-функцией называется всякая хеш-функция,
являющаяся криптостойкой, то есть, удовлетворяющая ряду требований
специфичных для криптографических приложений.
Для того, чтобы хеш-функция H считалась криптографически стойкой, она
должна удовлетворять трем основным требованиям, на которых основано
большинство применений хеш-функций в криптографии:

~5~
Необратимость или стойкость к восстановлению прообраза хеш-функции это,
когда для заданного значения хеш-функции m  вычислительно невозможно найти
блок данных X, для которого H(X) = m.
Стойкость к коллизиям первого рода или восстановлению вторых прообразов
это, когда для заданного сообщения M  вычислительно невозможно подобрать другое
сообщение N, для которого H(N) = H(M).
Стойкость к коллизиям второго рода представлен случаем, когда вычислительно
невозможно подобрать пару сообщений  , имеющих одинаковый хеш.
Данные требования не являются независимыми:
Обратимая функция нестойка к коллизиям первого и второго рода.
Функция, нестойкая к коллизиям первого рода, нестойка к коллизиям
второго рода; обратное неверно.
Следует отметить, что не доказано существование необратимых хеш-функций,
для которых вычисление какого-либо прообраза заданного значения хеш-функции
теоретически невозможно. Обычно нахождение обратного значения является лишь
вычислительно сложной задачей.
Криптографическая хеш-функция Н, которая используется для аутентификации
сообщений, должна обладать следующими свойствами:
1. Хеш-функция Н должна применяться к блоку данных любой длины.
2. Хеш-функция Н создает выход фиксированной длины.
3. Н (М) относительно легко (за полиномиальное время) вычисляется для любого
значения М.
4. Для любого данного значения хеш-кода h вычислительно невозможно найти
M такое, что Н (M) = h.
5. Для любого данного х вычислительно невозможно найти y x, что H (y) =
H(x).
6. Вычислительно невозможно найти произвольную пару (х, y) такую, что H(y)
= H (x).
Первые три свойства требуют, чтобы хеш-функция создавала хеш-код для
любого сообщения.
Четвертое свойство определяет требование односторонности хеш-функции:
легко создать хеш-код по данному сообщению, но невозможно восстановить
сообщение по данному хеш-коду. Это свойство важно, если аутентификация с
использованием хеш-функции включает секретное значение. Само секретное
значение может не посылаться, тем не менее, если хеш-функция не является
односторонней, противник может легко раскрыть секретное значение.
Пятое свойство гарантирует, что невозможно найти другое сообщение, чье
значение хеш-функции совпадало бы со значением хеш-функции данного сообщения.
Это предотвращает подделку аутентификатора при использовании зашифрованного
хеш-кода. В данном случае противник может читать сообщение и, следовательно,
создать его хеш-код. Но так как противник не владеет секретным ключом, он не
имеет возможности изменить сообщение так, чтобы получатель этого не обнаружил .
Если данное свойство не выполняется, атакующий имеет возможность выполнить
следующую последовательность действий: перехватить сообщение и его
зашифрованный хеш-код, вычислить хеш-код сообщения, создать альтернативное
сообщение с тем же самым хеш-кодом, заменить исходное сообщение на поддельное.
Поскольку хеш-коды этих сообщений совпадают, получатель не обнаружит подмены.

~6~
Хеш-функция, которая удовлетворяет первым пяти свойствам, называется
простой или слабой хеш-функцией. Если кроме того выполняется шестое свойство, то
такая функция называется криптографической или сильной хеш-функцией.

Принципы построения. В общем случае, в основе построения хеш-функции


лежит итеративная последовательная схема. Ядром алгоритма является сжимающая
функция — преобразование k входных в n выходных бит, где n — разрядность хеш-
функции, а k — произвольное число большее n. При этом сжимающая функция
должна удовлетворять всем условиям криптостойкости.
Входной поток разбивается на блоки по (k-n) бит. Алгоритм использует
временную переменную размером в n бит, в качестве начального значения которой
берется некое, общеизвестное число. Каждый следующий блок данных объединяется
с выходным значением сжимающей функции на предыдущей итерации. Значением
хеш-функции являются выходные n бит последней итерации. Каждый бит выходного
значения хеш-функции зависит от всего входного потока данных и начального
значения. Таким образом достигается лавинный эффект.
При проектировании хеш-функций на основе итеративной схемы (рис.15)
возникает проблема с размером входного потока данных. Размер входного потока
данных должен быть кратен (k-n). Как правило, перед началом алгоритма данные
расширяются неким, заранее известным, способом.
Помимо однопроходных алгоритмов, существуют многопроходные алгоритмы, в
которых ещё больше усиливается лавинный эффект. В данном случае, данные
сначала повторяются, а потом расширяются до необходимых размеров.

Сжимающая функция на основе симметричного блочного алгоритма. В качестве


сжимающей функции можно использовать симметричный блочный алгоритм
шифрования. Для обеспечения большей безопасности можно использовать в качестве
ключа блок данных предназначенный к хешированию на данной итерации, а
результат предыдущей сжимающей функции в качестве входа. Тогда результатом
последней итерации будет выход алгоритма (рис. 16).
В таком случае безопасность хеш-функции базируется на безопасности
используемого алгоритма (рис. 17).

Рис. 16. Итеративная последовательная схема

~7~
A, B и C могут принимать значения  ,  ,   или быть
константой, где   — i-ый блок входного потока,   — сложение по модулю 2,   —
результат i-ой итерации.

Рис. 17. Обобщенная схема формирования хеш-функции

Обычно при построении хеш-функции используют более сложную систему.


Обобщенная схема симметричного блочного алгоритма шифрования изображена на
рис.18.

Рис.18. Четыре схемы безопасного хеширования

Таким образом, мы получаем 64 варианта построения сжимающей функции.


Большинство из них являются либо тривиальными, либо небезопасными. Ниже
изображены четыре наиболее безопасные схемы при всех видах атак.
Основным недостатком хеш-функций, спроектированных на основе блочных
алгоритмов, является низкая скорость работы. Необходимую криптостойкость можно
обеспечить и за меньшее количество операций над входными данными. Существуют
более быстрые алгоритмы хеширования, спроектированных самостоятельно, с нуля,
исходя из требований криптостойкости (наиболее распространенные из них —
MD5, SHA-1, SHA-2 и ГОСТ Р 34.11-94).

Электронная цифровая подпись. ЭЦП – по сути шифрование сообщения


алгоритмом с открытым ключом. Текст, зашифрованный секретным ключом,
объединяется с исходным сообщением. Тогда проверка подписи — расшифрование
открытым ключом, если получившийся текст аналогичен исходному тексту —
подпись верна.
Использование хеш-функции позволяет оптимизировать данный алгоритм.
Производится шифрование не самого сообщения, а значение хеш-функции взятой от
сообщения. Данный метод обеспечивает следующие преимущества:
Понижение вычислительной сложности. Как правило, документ значительно
больше его хеша.
Повышение криптостойкости. Криптоаналитик не может, используя открытый
ключ, подобрать подпись под сообщение, а только под его хеш.

~8~
Обеспечение совместимости. Большинство алгоритмов оперирует со строками
бит данных, но некоторые используют другие представления. Хеш-функцию можно
использовать для преобразования произвольного входного текста в подходящий
формат.

1.1.6. Хеширование пароля

Для любого веб-разработчика, насколько актуально разработать надежную


систему учетных записей пользователей. А самым важным аспектом системы
учетных записей является надежная система защиты паролей пользователей.
Базы данных учетных записей пользователей часто взламываются, поэтому
необходимо сделать все возможное для защиты паролей пользователей на тот случай,
если сайт будет взломан.
Самым лучшим способом защиты паролей является «соленое» хеширование
пароля. И в этой статье объясняется, как сделать это должным образом.
Хеширование пароля – это один из тех предметов, которые очень просты по
своей сути, и наша задача понять как правильно делать хеширование, и почему оно
должно быть сделано именно так.
Как известно, хеш-алгоритмы являются односторонними функциями. Они
превращают любое количество данных в «дактилоскопический отпечаток»
фиксированной длины, который не может быть обратим.
Также эти алгоритмы имеют такое свойство, что если входное значение
изменяется даже совсем немного, полученный хеш-код полностью отличается от
исходного.
Это отлично подходит для защиты паролей, потому что мы хотим сохранить
пароли в зашифрованном виде, невозможном для расшифровки, и в то же время мы
должны быть способны проверить то, что пароль пользователя корректен.
Общая схема процесса регистрации аккаунта и аутентификации в системе
учетных записей, основанной на хешировании, выглядит следующим образом:
1. Пользователь создает учетную запись;
2. Вычисляется хеш-код от пароля и сохраняется в базе данных. Нет никакого
смысла хранить пароль, записанный в обычном текстовом (незашифрованном)
формате на жестком диске.
3. Когда пользователь пытается войти в систему, хеш-код, вычисленный от
пароля, который он ввел, сравнивается с хеш-кодом реального пароля
(извлеченным из базы данных);
4. Если хеш-коды совпадают, пользователю предоставляется доступ. Если нет –
пользователю сообщается, что он ввел неверные данные для входа в учетную
запись;
5. Шаги 3 и 4 повторяются каждый раз, когда кто-либо пытается войти в свой
аккаунт.
На шаге 4 никогда не сообщайте пользователю, что именно не так: имя
пользователя или пароль. Всегда отображайте только общее сообщение, например,
«Неверное имя пользователя или пароль». Это не позволит злоумышленникам
вычислить верные имена пользователей без знания их паролей.
Следует отметить, что хеш-функции, используемые для защиты паролей, это не
те же хеш-функции, которые вы могли видеть на занятиях по структурам данных.

~9~
Хеш-функции, используемые для реализации структур данных, таких как хеш-
таблицы, разрабатываются для того, чтобы быть быстрыми, а не безопасными.
Только криптографические хеш-функции могут быть использованы для
реализации хеширования паролей. Такие функции, как  SHA256, SHA512, RipeMD
и WHIRLPOOL  являются криптографическими хеш-функциями.
Легко подумать, что все, что вы должны сделать, это пропустить пароль через
криптографическую хеш-функцию, и пароли ваших пользователей будут в
безопасности. Это далеко не так. Есть много видов атак, позволяющих очень быстро
восстановить пароли из простых хеш-кодов.
Существует несколько эффективных и легко реализуемых решений, которые
делают эти атаки намного менее эффективными. Предварительно давайте обсудим
некоторые распространенные виды атак, используемые для взлома простых хеш-
кодов паролей.
Самые распространенные атаки на хеш-коды. Самый простой способ взломать
хеш-код – это попробовать угадать пароль, вычисляя хеш-код для каждого
предположения и проверяя, совпадает ли этот хеш-код со взламываемым паролем.
Если хеш-коды одинаковые, то предположенная комбинация является паролем.
Двумя наиболее распространенными способами угадывания паролей является атаки
по словарю и атаки полным перебором.
Атака по словарю использует файл, содержащий слова, фразы,
распространенные пароли и другие строки, которые с некоторой вероятностью могут
быть использованы в качестве пароля. Каждое слово в файле захешировано, и его
хеш-код сравнивается с хеш-кодом пароля.
Если они совпадают, то данное слово является паролем. Такие файлы словарей
построены путем извлечения слов из больших массивов текста и даже из реальных
баз данных паролей. Часто применяется дополнительная обработка файлов словарей,
например.
Атака полным перебором пробует все возможные комбинации символов до
заданной длины. Эти атаки требуют очень больших вычислительных затрат, и, как
правило, они наименее эффективны по показателю число взломанных хеш-кодов на
время выполнения, но они всегда в конечном счете находят пароль.
Пароли должны быть достаточной длины, чтобы поиск по всем возможным
символьным строкам для его нахождения занимал слишком много времени, чтобы
оправдывать себя.
Не существует методов предотвращения атак по словарю или атак полным
перебором. Можно сделать их менее эффективными, но нет способа предотвратить
их полностью. Если ваша система хеширования паролей безопасна, единственный
способ взломать хеш-коды – это выполнить атаку по словарю или полным перебором
для каждого хеш-кода.

Таблицы поиска – это крайне эффективный метод для очень быстрого взлома
большого количества хеш-кодов одного типа. Основная идея заключается в том,
чтобы заранее вычислить хеш-коды паролей из словаря паролей, а затем сохранить
хеш-коды и соответствующие им пароли в структуру данных типа таблица поиска.
Умело реализованные таблицы поиска могут обрабатывать сотни поисков хеш-
кодов в секунду, даже если они содержат много миллиардов хеш-кодов.
Если вы хотите больше узнать о том, насколько быстрыми могут быть таблицы
поиска, попробуйте взломать следующие sha256 хеш-коды с помощью бесплатного
хеш-взломщика от CrackStation (https://crackstation.net/).

~ 10 ~
Эти хеш-коды могут быть взломаны меньше чем за 1 секунду:
c11083b4b0a7743af748c85d343dfee9fbb8b2576c05f3a7f0d632b0926aadfc
08eac03b80adc33dc7d8fbe44b7c7b05d3a2c511166bdb43fcb710b03ba919e7
e4ba5cbd251c98e6cd1c23f126a3b81d8d8328abc95387229850952b3ef9f904
5206b8b8a996cf5320cb12ca91c7b790fba9f030408efe83ebb83548dc3007bd
d53d8d0632cd64e595b2cc9709bd580e4d323cd65ebbfaa778b3252c761ba1b8
Вы можете сгенерировать собственный хеш-код вашего наиболее часто
используемого пароля здесь и попробовать взломать его с помощью упомянутого
выше инструмента.

Обратные таблицы поиска. Этот вид атаки позволяет злоумышленнику


применить атаку по словарю или полным перебором ко многим хеш-кодам
одновременно без наличия предварительно вычисленной таблицы поиска.
Сначала злоумышленник создает таблицу поиска, которая сопоставляет каждый
хеш-код пароля из скомпрометированной базы данных пользовательских аккаунтов
со списком пользователей, имевших этот хеш-код. Затем взломщик хеширует каждый
предполагаемый пароль и использует таблицу поиска для получения списка
пользователей, чей пароль был угадан взломщиком.
Этот вид атак особенно эффективен, потому что зачастую несколько
пользователей имеют один и тот же пароль.

Радужные таблицы – это техника, являющаяся компромиссом между временем


поиска и занимаемой памятью. Они похожи на таблицы поиска, за исключением того,
что они жертвуют скоростью взлома хеш-кодов, чтобы сделать таблицы поиска
меньше.
Так как таблицы меньше, решения для большего количества хеш-кодов могут
быть сохранены в том же объеме памяти, делая такие таблицы более эффективными.
Существуют радужные таблицы, которые могут взломать любой md5 хеш-код пароля
вплоть до 8 символов в длину.
Далее мы рассмотрим технику под названием «соление», которая делает
невозможным использование радужных таблиц и таблиц поиска для взлома хеш-
кодов.

1.1.7. Соленое хеширование пароля

Если два пользователя имеют один и тот же пароль, у них будет совпадать и
хеш-код пароля. Необходимо предотвратить такого рода атаки, внеся случайную
составляющую в каждый хеш-код; таким образом, когда составной пароль
хешируется, хеш-коды получаются разные.
Мы можем внести случайную составляющую в хеш-коды, добавив в конец или в
начало пароля случайную строку, называемую «соль», перед операцией хеширования.
При этом, всякий раз получаются совершенно разные строки из одного и того же
хеш-кода пароля.
Чтобы проверить, корректен ли пароль, нам нужна соль, поэтому обычно ее
сохраняют в базе данных пользовательских аккаунтов вместе с хеш-кодом, или как
часть самой строки хеш-кода.
Соль не обязательно держать в секрете. Просто при использовании случайной
величины для построения хеш-кода таблицы поиска, обратные таблицы поиска и
радужные таблицы становятся неэффективными. Злоумышленник не узнает заранее,

~ 11 ~
какая будет соль, поэтому он не может предварительно вычислить таблицу поиска
или радужную таблицу.
Если пароль каждого пользователя хешируется с помощью разной соли, атака с
использованием обратной таблицы поиска также не будет работать.
Остерегайтесь использовать короткую соль или повторное использование одной
и той же соли.
Радужные таблицы и таблицы поиска работают только потому, что каждый
пароль хешируется совершенно одинаковым способом. Если два пользователя имеют
один и тот же пароль, у них будет совпадать и хеш-код пароля.

1.1.8. Коллизии хеш-функций

Так как хеш-функции отображают произвольное количество данных в строке


фиксированной длины, должны существовать такие входные данные, хеш-коды
которых совпадают. Криптографические хеш-функции разработаны так, что такие
коллизии встретить невероятно трудно. Время от времени криптографы находят
«атаки» на хеш-функции, которые облегчают нахождение коллизий. Недавний
пример – это хеш-функция алгоритма MD5, для которой действительно были
найдены коллизии.
Атаки коллизии – это признак того, что существует вероятность наличия для
строки, отличной от пароля пользователя, точно такого же хеш-кода. Однако
нахождение коллизий даже в такой слабой хеш-функции как MD5 требует большой
вычислительной мощности, поэтому маловероятно, что такие коллизии «нечаянно»
произойдут на практике.
Пароль, захешированный с помощью MD5 и соли, так же надежен, для всех
практических целей, как если бы он был захеширован при помощи SHA256 и соли.
Тем не менее, неплохо использовать и более безопасные хеш-функции, такие
как SHA256, SHA512, RipeMD или WHIRLPOOL, если это возможно.

1.1.9. Основные правила безопасного хеширования паролей

Мы уже знаем, как злобные хакеры могут взломать простые хеш-коды очень
быстро, используя таблицы поиска и радужные таблицы. Мы также знаем, что
внесение случайной составляющей в хеширование при помощи соли является
решением для этой проблемы. Но как генерировать соль, и как применить ее к
паролю?
Соль должна быть сгенерирована при помощи криптографически стойкого
генератора псевдослучайных чисел (англ. Cryptographically secure pseudorandom
number generator, CSPRNG). Такие генераторы сильно отличаются от обычных
генераторов псевдослучайных чисел, наподобие функции rand() в языке C.
Как следует из названия, криптографически стойкие генераторы предназначены
быть криптографически надежными, в том смысле, что они обеспечивают высокий
уровень случайности и совершенно непредсказуемы.
Мы не хотим, чтобы наша соль была предсказуема, поэтому мы и должны
использовать криптографически стойкий генератор. В таблице, приведенной ниже,
перечислены некоторые такие генераторы, существующие для распространенных
платформ программирования:

~ 12 ~
Платформа CSPRNG

PHP mcrypt_create_iv, openssl_random_pseudo_bytes

Java java.security.SecureRandom

.NET (C#, VB.NET) System.Security.Cryptography.RNGCryptoServiceProvide


r

Ruby SecureRandom

Python os.urandom

Perl Math::Random::Secure

C/C++ (Windows API) CryptGenRandom

Любой язык в GNU/Linux или Читать из /dev/random или /dev/urandom


Unix

Соль должна быть своя для каждого пользователя и пароля. Каждый раз, когда
пользователь создает учетную запись, или изменяет свой пароль, пароль должен быть
захеширован с помощью новой случайной соли. Никогда не используйте соль
повторно. Также соль должна быть длинной, поэтому существует очень много
возможных вариантов. Опираясь на жизненный опыт, следует использовать соль, по
меньшей мере, той же длины, что и выход хеш-функции. Соль должна быть
сохранена в таблице учетных записей пользователей вместе с хеш-кодом.

Сохранение пароля:
1. Генерируем длинную случайную соль, используя криптографически стойкий
генератор псевдослучайных чисел;
2. Присоединяем соль к паролю и вычисляем хеш-код с помощью стандартной
криптографической хеш-функции, например, SHA256;
3. Сохраняем и соль, и хеш-код в записи базы данных пользователей.

Проверка пароля:
1. Извлекаем соль и хеш-код пользователя из базы;
2. Добавляем соль к введенному паролю и вычисляем хеш-код с помощью той же
самой функции;
3. Сравниваем хеш-код введенного пароля с хеш-кодом из базы данных. Если они
совпадают, пароль верен. В противном случае, пароль введен неправильно.

1.1.10. Хеш-код в веб-приложениях

Если вы работаете с веб-приложением, встает вопрос, где лучше реализовать


операцию вычисления хеш-кодов. Должен ли пароль быть захеширован в браузере

~ 13 ~
пользователя с помощью JavaScript, или он должен быть отправлен на сервер
«открытым текстом» и захеширован там?
Даже если вы вычисляете хеш-код пользовательского пароля, используя
JavaScript, вы все равно должны произвести хеширование хеш-кодов на сервере.
Предположим, что веб-сайт производит вычисление хеш-кода паролей в
браузерах пользователей без хеширования хеш-кодов на сервере. Для
аутентификации пользователя этот веб-сайт будет принимать хеш-код от браузера, и
проверять, совпадает ли этот хеш-код с тем, что хранится в базе данных. Кажется, что
это более безопасно, чем просто хеширование на сервере, так как пароли
пользователей никогда не отправляются на сервер, но это не так.
Проблема в том, что хеш-код на стороне клиента по логике становится
пользовательским паролем. Все, что пользователю нужно сделать для
аутентификации, это указать серверу хеш-код своего пароля. Если бы хакер получил
хеш-код пользователя, он мог бы использовать его для аутентификации на сервере, не
зная пользовательского пароля!
Таким образом, если злоумышленник каким-то образом украдет базу данных
хеш-кодов с этого гипотетического веб-сайта, он получит непосредственный доступ к
учетной записи каждого пользователя без необходимости угадывать какой-либо
пароль.
А это не означает, что пользователю не следует вычислять хеш-код в браузере,
но если вы делаете это, вы обязаны производить хеширование и на сервере тоже.
Хеширование в браузере – это, определенно, хорошая идея, но учитывайте, что
Хеширование пароля на стороне клиента не замещает HTTPS (SSL/TLS).
Если соединение между браузером и сервером ненадежно, третья сторона может
изменить код JavaScript во время загрузки, чтобы удалить функцию хеширования и
получить пароль пользователя.
Поскольку вы хешируете и используете хорошую соль на сервере, то можно
использовать имя пользователя (или адрес электронной почты), конкатенированный
со специфичной для сайта строкой (например, именем домена) в качестве соли на
клиентской стороне.

1.1.11. Медленные хеш-функции – растяжение ключа

«Соль» гарантирует, что злоумышленники не смогут использовать


специализированные атаки, такие как таблицы поиска и радужные таблицы, чтобы
быстро взламывать большое количество хеш-кодов, но это не мешает им запустить
атаку по словарю или атаку полным перебором индивидуально для каждого хеш-
кода.
Высококачественные видеокарты и правильно подобранное железо могут
вычислять миллиарды хеш-кодов в секунду, поэтому эти атаки до сих пор очень
эффективны. Чтобы сделать их менее эффективными, мы можем использовать
технологию под названием растяжение ключа.
Главная идея – сделать хеш-функцию очень медленной, чтобы даже с помощью
быстрой видеокарты и специального оборудования, атаки по словарю и полным
перебором были слишком медленными, чтобы оправдывать себя. 
Цель – сделать хеш-функцию достаточно медленной, чтобы помешать атакам, но
при этом довольно быстрой, чтобы не создавать видимой задержки для пользователя.

~ 14 ~
Растяжение ключа реализуется при помощи специального типа хеш-функции,
нагружающей ЦПУ. Не пытайтесь изобрести свою собственную – простое
итеративное хеширование хеш-кода пароля не достаточно, так как оно может быть
распараллелено на аппаратном уровне и выполнено так же быстро, как и обычный
хеш-код.
Используйте стандартный алгоритм, такой как PBKDF2 или bcrypt. Реализацию
алгоритма PBKDF2 на PHP можно найти здесь.
Эти алгоритмы принимают в качестве аргумента коэффициент надежности или
счетчик итераций. Эта величина определяет, насколько медленной будет хеш-
функция.
Для настольного программного обеспечения или приложений для смартфонов
самый лучший способ выбрать этот параметр – это запустить короткий тест на
устройстве, чтобы найти величину, при которой хеш-код вычисляется примерно
полсекунды. Таким образом, ваша программа может быть максимально надежной, не
влияя на работу пользователя.
Если вы применяете хеширование растяжения ключа в веб-приложении, вы
должны знать, что вам потребуются дополнительные вычислительные ресурсы,
чтобы обрабатывать огромный объем запросов аутентификации, и что растяжение
ключа облегчает выполнение атак типа «отказ в обслуживании» (DoS) на ваш сайт.
Оптимальным считается использование процедуры растяжения ключа, но с
небольшим значением счетчика итераций. Вам нужно вычислить счетчик итераций,
основываясь конкретно на ваших вычислительных ресурсах и на ожидаемой
максимальной скорости запросов на проверку подлинности.
Угроза отказа в обслуживании может быть устранена, если заставить
пользователей вводить капчу каждый раз, когда они входят в учетную запись. Всегда
проектируйте вашу систему так, чтобы счетчик итераций мог быть увеличен или
уменьшен в будущем.
Если вы волнуетесь насчет вычислительной нагрузки, но все еще хотите
использовать растяжение ключа в веб-приложении, рассмотрите выполнение
алгоритма растяжения ключа в пользовательском браузере с помощью
JavaScript. Stanford JavaScript Crypto Library включает в себя PBKDF2.
Счетчик итераций должен быть установлен достаточно небольшим, чтобы
система могла использоваться с более медленными клиентами, такими как
мобильные устройства. Также система должна передавать вычисления серверу, если
пользовательский браузер не поддерживает JavaScript.
Растяжение ключа на стороне клиента не отменяет необходимость хеширования
на сервере. Вы должны хешировать хеш-код, сгенерированный клиентом так же, как
если бы хешировали обычный пароль.

1.1.12. Имитовставка и аппаратное хеширование паролей

Пока злоумышленник может использовать хеш-код для проверки, верен ли


предполагаемый пароль или нет, он может применить к хеш-коду атаку по словарю
или атаку полным перебором. Следующим шагом является добавление секретного
ключа к хеш-коду.
Таким образом, только тот, кто знает ключ, может использовать хеш-код для
проверки пароля. Это может быт выполнено двумя способами. Или хеш-код может
быть зашифрован с помощью шифра, такого как AES, или секретный ключ включен в

~ 15 ~
хеш-код с помощью алгоритма имитовставки, например HMAC (хеш-код
аутентификации сообщений).
Это не так легко, как кажется. Ключ нужно держать в секрете от
злоумышленников, даже в случае взлома. Если злоумышленник получает полный
доступ к системе, он будет способен украсть ключ вне зависимости от того, где он
сохранен.
Ключ должен быть сохранен во внешней системе, такой как физически
изолированный сервер, выделенный для проверки паролей, или на специальном
устройстве, подключенному к серверу, например, YubiHSM.
Если вы не можете позволить себе несколько выделенных серверов или
специальные аппаратные устройства, вы все равно можете получить некоторую
пользу от имитовставки на стандартном веб-сервере.
Большинство баз данных взламываются с помощью атак SQL-инъекциями,
которые, в большинстве случаев, не дают злоумышленникам доступ к локальной
файловой системе (отключите доступ на вашем SQL сервере к локальной файловой
системе, если он поддерживает такую функцию).
Если вы сгенерируете случайный ключ и сохраните его в файле, к которому нет
доступа из Интернета, и включите его в «соленые» хеш-коды, то эти хеш-коды не
будут уязвимы, даже если ваша база данных будет взломана с использованием
простой атаки SQL-инъекциями.
Не прописывайте ключ в исходном коде, генерируйте его случайным образом,
когда приложение установлено. Это не так надежно, как использование отдельной
системы для вычисления хеш-кода паролей, потому что, если в веб-приложении есть
уязвимости к SQL-инъекциям, вероятно, существуют и другие виды уязвимостей,
такие как подключение к локальному файлу, которые злоумышленник мог бы
использовать для чтения файла с секретным ключом. Но лучше это, чем ничего.
Пожалуйста, обратите внимание, что имитовставка не избавляет от
необходимости использования соли. Умные злоумышленники в конечном итоге
найдут способы скомпрометировать ключи, поэтому важно, чтобы хеш-коды были
дополнительно защищены солью и растяжением ключа.

1.1.13. Другие методы защиты

Хеширование защищает пароли в случае нарушения безопасности. Это не делает


приложение в целом более безопасным. Многое еще нужно сделать, чтобы
предотвратить в первую очередь кражу хеш-кодов (и других пользовательских
данных).
Даже опытные разработчики должны быть образованы в сфере безопасности для
того, чтобы писать безопасные приложения. Если вы не разобрались со всеми
уязвимостями в списке, не пытайтесь написать веб-приложение, имеющее дело с
конфиденциальными данными. Работодатель ответственен за обеспечение всех
разработчиков надлежащей подготовкой в сфере разработки безопасных приложений.
Хорошей идеей является наличие «теста на проникновение» третьей стороны
для вашего приложения. Даже самые лучшие программисты допускают ошибки,
поэтому хорошо бы иметь эксперта по безопасности, проверяющего код на
потенциальные уязвимости.
Найдите надежную организацию (или наймите сотрудников) для проверки
вашего кода на постоянной основе. Процесс проверки безопасности нужно начинать
на ранней стадии проекта и продолжать на протяжении всей разработки.

~ 16 ~
Также важно проводить мониторинг вашего сайта, чтобы обнаружить нарушение
безопасности, если это произошло.
Если нарушение не было обнаружено, злоумышленник может через ваш сайт
заражать компьютеры посетителей вредоносными программами, поэтому
чрезвычайно важно, чтобы бреши в безопасности были обнаружены и устранены
максимально быстро.
http://www.convertstring.com/ru/Hash

2. Практическая часть

2.1. Порядок выполнения задания


1. Изучить теоретический материал лабораторной работы.

2. Изучить наиболее популярные алгоритмы хеширования (быстрые


алгоритмы хеширования, криптографические хеш-функции, процедуры
растяжения ключа и обработки паролей хеш-взломщиком, алгоритм
имитовставки, как процедура шифрации паролей).

2.2. Практические задания

Задание 1. Реализовать процедуру хеширования с использованием быстрых


алгоритмов хеширования (MD5, SHA-1, SHA-2 и ГОСТ Р 34.11-94) в режиме
Online на конкретных примерах со скриншотами и подробным описанием.

Задание 2. Выполнить процедуру хеширования с использованием


криптографических хеш функций для хеширования паролей (SHA256, SHA512,
RipeMD и WHIRLPOOL ) в режиме Online на конкретных примерах со
скриншотами и подробным описанием.

Задание 3. Осуществить процедуру обработки паролей с помощью хеш-


взломщика (например, программы CrackStation) в режиме Online на конкретных
примерах со скриншотами и подробным описанием.

Задание 4. Реализовать процедуру хеширования «пароля в паре с солью» с


использованием известных алгоритмов хеширования в режиме Online на
конкретных примерах со скриншотами и подробным описанием.

Задание 5. На конкретных примерах со скриншотами и подробным


описанием в режиме Online реализовать процедуру растяжения ключа с
использованием известного алгоритма (PBKDF2, написанного на PHP).

Задание 6. Реализовать алгоритм имитовставки, как процедуру шифрации


пароля. Все операции по реализации задания сопровождать подробным описанием и
скриншотами.

~ 17 ~
2.3. Вопросы по разделу

1. Дайте развернутое определение хеш-функции.


2. Что такое криптографическая хеш-функция?
3. Возможная область применения хеш-функций.

4. Криптостойкость алгоритма хеширования.


5. Хеш-функция как инструмент поиска вирусов.
6. Использование хеш-функции для защиты от фальсификации
передаваемой информации.
7. Каким обязательным требованиям должна удовлетворять
криптографически стойкая хеш-функция?
8. Дать развернутое определение понятию - стойкость к восстановлению
прообраза хеш-функции.
9. Что такое стойкость хеш-функции к коллизиям первого и второго рода?
10. Дайте развернутое определение понятию необратимая хеш-функция.
11. Какими свойствами должна обладать хеш-функция, которая используется
для аутентификации сообщений?
12. Какими свойствами должна обладать простая (слабая) хеш-функция.
13. Какими свойствами должна обладать криптографическая (сильная) хеш-
функция.
14. Что такое итеративная последовательная схема построения хеш-функции?
15. Дать развернутое определение сжимающей функции, построенной с
использованием симметричного блочного алгоритма.
16. Привести и описать обобщенную схему симметричного блочного
алгоритма шифрования.
17. С какой целью хеш-функция используется алгоритмом ЭЦП?
18. Общая схема процесса регистрации аккаунта и аутентификации в системе
учетных записей, основанной на хешировании.
19. Что такое хеширование пароля?
20. Дайте развернутое определение хеш-таблице, которая используется для
реализации структур данных.
21. Какие хеш-функции можно использовать в режиме online-Internet для
реализации функции хеширования паролей?
22. Приведите список хеш-функций, которые можно использовать в режиме
online-Internet для реализации хеширования паролей.
23. Назовите и охарактеризуйте основные виды атак на хеш-коды.
24. Приведите подробное описание атаки на хеш-код по словарю.
25. Приведите подробное описание атаки на хеш-код методом полного
перебора.
26. Дайте подробное описание таблицы поиска как одного из методов
эффективного взлома хеш-кодов.
27. Дайте подробное описание радужной таблицы поиска как одного из
методов эффективного взлома хеш-кодов.

~ 18 ~
28. Дайте подробное описание обратной таблицы поиска как одного из
методов эффективного взлома хеш-кодов.
29. Дайте определение понятию – «соленое» хеширование пароля.
30. С какой целью, на каком этапе и куда именно необходимо вносить
случайную составляющую в пароль в процессе формирования хеш-функции.
31. Дайте развернутое описание атаки на хеш-функцию, по методу
нахождений ее коллизий. Известные средства защиты.
32. Основные правила безопасного хеширования паролей.
33. Что такое криптографически стойкий генератор псевдослучайных чисел?
34. Приведите схему (последовательность выполняемых операций) в
процессе реализации процедур сохранения и проверки пароля.
35. Использование хеш-кодов в веб-приложениях.
36. Медленные хеш-функции – растяжение ключа.
37. Для каких целей используются алгоритмы PBKDF2 или bcrypt в
процедурах хеширования?
38. Имитовставка и аппаратное хеширование паролей.
39. Назначение и область применения функции HMAC (hash-based message
authentication code).
40. Принцип действия и алгоритм реализации функции HMAC.
41. Принцип действия и основные характеристики адаптивной
криптографической функции bcrypt.
42. Функция bcrypt – принцип действия, преимущества и недостатки.
43. Функция PBKDF2 (Password-Based Key Derivation Function) – назначение
и область применения.
44. Функция PBKDF2 (Password-Based Key Derivation Function) – алгоритм и
основные характеристики. 
45. Функция scrypt (адаптивная криптографическая функция формирования
ключа) – принцип действия, преимущества и недостатки.
46. Назначение, область применения и алгоритм функции scrypt.
47. Что такое «тест на проникновение» и где он используется?
48. Основные возможности и особенности программы Dropbox.
49. Криптографически стойкий генератор псевдослучайных чисел
(Cryptographically secure pseudorandom number generator) – основные требования.
50. Генераторы псевдослучайных последовательностей. Использование
стандартных функций языков высокого уровня.
51. Криптографически стойкий генератор псевдослучайных чисел на основе
криптографических алгоритмов.
52. Конгруэнтный генератор псевдослучайных чисел.
53. Генератор псевдослучайных чисел ANSI X9.17. Алгоритм и основные
характеристики.
54. Алгоритм хеш-функции MD5.
55. Алгоритм хеш-функции SHA(Secure Hash Algorithm).
56. Функция хеширования ГОСТ Р 34.11–94.
57.  Функции хеширования SHA-256, SHA-512 И SHA-384.
58. Алгоритм хеш-функции RipeMD.
59. Алгоритм хеш-функции WHIRLPOOL.
60. Интерфейс и основные характеристики хеш-взломщика от CrackStation
(https://crackstation.net/).

~ 19 ~
2.4. Порядок отчетности и форма контроля выполнения работы

Раздел 1. Теоретическая часть. Выполнение лабораторной работы


осуществляется в два этапа: на первом этапе дается письменный ответ на вопросы из
пункта 2.2. Каждый вариант предполагает ответы на вопросы согласно номеру
варианта, и перечню вопросов приведенных в соответствующем столбце таблицы 2.1.
Контроль выполнения задания производится по окончании занятия и на
консультациях в форме защиты выполненной работы, предоставленной в
электронном и в бумажном виде в форме «Отчет по лабораторной работе».

Раздел 2. Практическая часть.

Пользователь, выполняющий практическое задание (раздел 2.1) должен


обладать правами администратора. Все пункты практического задания должны
сопровождаться скриншотами с подробным описанием последовательности
выполняемых операций.

Таблица 2.1. Варианты заданий


Номер варианта
1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 18 1 20

1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 1 2 3 4 5
9 1 1 1 13 1 1 1 8 9 1 1 1 1 1 1 1 14 1 16
Номера вопросов

1 1 1 2 21 2 2 2 1 1 1 1 1 2 2 2 2 25 2 27
2 2 2 2 29 3 3 3 2 2 2 2 2 2 2 3 3 36 3 38
3 3 3 3 37 3 3 4 3 3 3 3 3 3 3 4 4 47 4 49
4 4 4 4 45 4 4 4 3 3 3 4 4 4 4 5 5 58 5 60
4 5 5 5 53 5 5 5 4 4 4 4 4 4 5 7 8 9 1 11
5 5 5 6 6 7 8 9 5 5 5 5 5 5 5 1 1 20 2 22
1 1 1 1 19 2 2 2 5 5 6 1 2 3 4 2 3 31 3 33
2 2 2 2 32 3 3 3 1 1 1 2 2 2 2 4 4 42 4 44

~ 20 ~