Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Оглавление
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.Понятие хеш-функции
Впрочем, кое-что общее у них все же есть: каждая строка имеет длину ровно 40
символов. Кроме того, если вы захешируете весь предыдущий абзац целиком, то все
равно получите последовательность, состоящую ровно из 40 символов:
c5e7346089419bb4ab47aaa61ef3755d122826e2.
То есть 1128 символов, включая пробелы, были ужаты до строки той же длины,
что и пятибуквенное слово. То же самое произойдет даже с полным собранием
сочинений Уильяма Шекспира: на выходе вы получите строку из 40 букв и цифр. При
всем этом не может существовать двух разных массивов данных, которые
преобразовывались бы в одинаковый хеш. Рассмотрим еще несколько показательных
примеров хеширования.
Для наглядности, представим результаты нашего хеширования в виде схемы
(рис. 15).
~3~
Рис. 15. Примеры хеширования
~4~
Когда пользователь предпринял попытку незаконно распространить некий контент,
автоматические сканеры Dropbox засекли файлы, чьи хеши оказались в пресловутом
списке, и заблокировали возможность их распространения.
Где еще можно использовать хеш-функции помимо систем хранения паролей и
защиты медиафайлов? На самом деле задач, где используется хеширование,
достаточно много. Однако есть еще одна особенная область применения хешей, они
широко используются для детектирования вирусных программ, но об этом в
следующем разделе.
~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~
Хеш-функция, которая удовлетворяет первым пяти свойствам, называется
простой или слабой хеш-функцией. Если кроме того выполняется шестое свойство, то
такая функция называется криптографической или сильной хеш-функцией.
~7~
A, B и C могут принимать значения , , или быть
константой, где — i-ый блок входного потока, — сложение по модулю 2, —
результат i-ой итерации.
~8~
Обеспечение совместимости. Большинство алгоритмов оперирует со строками
бит данных, но некоторые используют другие представления. Хеш-функцию можно
использовать для преобразования произвольного входного текста в подходящий
формат.
~9~
Хеш-функции, используемые для реализации структур данных, таких как хеш-
таблицы, разрабатываются для того, чтобы быть быстрыми, а не безопасными.
Только криптографические хеш-функции могут быть использованы для
реализации хеширования паролей. Такие функции, как SHA256, SHA512, RipeMD
и WHIRLPOOL являются криптографическими хеш-функциями.
Легко подумать, что все, что вы должны сделать, это пропустить пароль через
криптографическую хеш-функцию, и пароли ваших пользователей будут в
безопасности. Это далеко не так. Есть много видов атак, позволяющих очень быстро
восстановить пароли из простых хеш-кодов.
Существует несколько эффективных и легко реализуемых решений, которые
делают эти атаки намного менее эффективными. Предварительно давайте обсудим
некоторые распространенные виды атак, используемые для взлома простых хеш-
кодов паролей.
Самые распространенные атаки на хеш-коды. Самый простой способ взломать
хеш-код – это попробовать угадать пароль, вычисляя хеш-код для каждого
предположения и проверяя, совпадает ли этот хеш-код со взламываемым паролем.
Если хеш-коды одинаковые, то предположенная комбинация является паролем.
Двумя наиболее распространенными способами угадывания паролей является атаки
по словарю и атаки полным перебором.
Атака по словарю использует файл, содержащий слова, фразы,
распространенные пароли и другие строки, которые с некоторой вероятностью могут
быть использованы в качестве пароля. Каждое слово в файле захешировано, и его
хеш-код сравнивается с хеш-кодом пароля.
Если они совпадают, то данное слово является паролем. Такие файлы словарей
построены путем извлечения слов из больших массивов текста и даже из реальных
баз данных паролей. Часто применяется дополнительная обработка файлов словарей,
например.
Атака полным перебором пробует все возможные комбинации символов до
заданной длины. Эти атаки требуют очень больших вычислительных затрат, и, как
правило, они наименее эффективны по показателю число взломанных хеш-кодов на
время выполнения, но они всегда в конечном счете находят пароль.
Пароли должны быть достаточной длины, чтобы поиск по всем возможным
символьным строкам для его нахождения занимал слишком много времени, чтобы
оправдывать себя.
Не существует методов предотвращения атак по словарю или атак полным
перебором. Можно сделать их менее эффективными, но нет способа предотвратить
их полностью. Если ваша система хеширования паролей безопасна, единственный
способ взломать хеш-коды – это выполнить атаку по словарю или полным перебором
для каждого хеш-кода.
Таблицы поиска – это крайне эффективный метод для очень быстрого взлома
большого количества хеш-кодов одного типа. Основная идея заключается в том,
чтобы заранее вычислить хеш-коды паролей из словаря паролей, а затем сохранить
хеш-коды и соответствующие им пароли в структуру данных типа таблица поиска.
Умело реализованные таблицы поиска могут обрабатывать сотни поисков хеш-
кодов в секунду, даже если они содержат много миллиардов хеш-кодов.
Если вы хотите больше узнать о том, насколько быстрыми могут быть таблицы
поиска, попробуйте взломать следующие sha256 хеш-коды с помощью бесплатного
хеш-взломщика от CrackStation (https://crackstation.net/).
~ 10 ~
Эти хеш-коды могут быть взломаны меньше чем за 1 секунду:
c11083b4b0a7743af748c85d343dfee9fbb8b2576c05f3a7f0d632b0926aadfc
08eac03b80adc33dc7d8fbe44b7c7b05d3a2c511166bdb43fcb710b03ba919e7
e4ba5cbd251c98e6cd1c23f126a3b81d8d8328abc95387229850952b3ef9f904
5206b8b8a996cf5320cb12ca91c7b790fba9f030408efe83ebb83548dc3007bd
d53d8d0632cd64e595b2cc9709bd580e4d323cd65ebbfaa778b3252c761ba1b8
Вы можете сгенерировать собственный хеш-код вашего наиболее часто
используемого пароля здесь и попробовать взломать его с помощью упомянутого
выше инструмента.
Если два пользователя имеют один и тот же пароль, у них будет совпадать и
хеш-код пароля. Необходимо предотвратить такого рода атаки, внеся случайную
составляющую в каждый хеш-код; таким образом, когда составной пароль
хешируется, хеш-коды получаются разные.
Мы можем внести случайную составляющую в хеш-коды, добавив в конец или в
начало пароля случайную строку, называемую «соль», перед операцией хеширования.
При этом, всякий раз получаются совершенно разные строки из одного и того же
хеш-кода пароля.
Чтобы проверить, корректен ли пароль, нам нужна соль, поэтому обычно ее
сохраняют в базе данных пользовательских аккаунтов вместе с хеш-кодом, или как
часть самой строки хеш-кода.
Соль не обязательно держать в секрете. Просто при использовании случайной
величины для построения хеш-кода таблицы поиска, обратные таблицы поиска и
радужные таблицы становятся неэффективными. Злоумышленник не узнает заранее,
~ 11 ~
какая будет соль, поэтому он не может предварительно вычислить таблицу поиска
или радужную таблицу.
Если пароль каждого пользователя хешируется с помощью разной соли, атака с
использованием обратной таблицы поиска также не будет работать.
Остерегайтесь использовать короткую соль или повторное использование одной
и той же соли.
Радужные таблицы и таблицы поиска работают только потому, что каждый
пароль хешируется совершенно одинаковым способом. Если два пользователя имеют
один и тот же пароль, у них будет совпадать и хеш-код пароля.
Мы уже знаем, как злобные хакеры могут взломать простые хеш-коды очень
быстро, используя таблицы поиска и радужные таблицы. Мы также знаем, что
внесение случайной составляющей в хеширование при помощи соли является
решением для этой проблемы. Но как генерировать соль, и как применить ее к
паролю?
Соль должна быть сгенерирована при помощи криптографически стойкого
генератора псевдослучайных чисел (англ. Cryptographically secure pseudorandom
number generator, CSPRNG). Такие генераторы сильно отличаются от обычных
генераторов псевдослучайных чисел, наподобие функции rand() в языке C.
Как следует из названия, криптографически стойкие генераторы предназначены
быть криптографически надежными, в том смысле, что они обеспечивают высокий
уровень случайности и совершенно непредсказуемы.
Мы не хотим, чтобы наша соль была предсказуема, поэтому мы и должны
использовать криптографически стойкий генератор. В таблице, приведенной ниже,
перечислены некоторые такие генераторы, существующие для распространенных
платформ программирования:
~ 12 ~
Платформа CSPRNG
PHP mcrypt_create_iv, openssl_random_pseudo_bytes
Java java.security.SecureRandom
Ruby SecureRandom
Python os.urandom
Perl Math::Random::Secure
Соль должна быть своя для каждого пользователя и пароля. Каждый раз, когда
пользователь создает учетную запись, или изменяет свой пароль, пароль должен быть
захеширован с помощью новой случайной соли. Никогда не используйте соль
повторно. Также соль должна быть длинной, поэтому существует очень много
возможных вариантов. Опираясь на жизненный опыт, следует использовать соль, по
меньшей мере, той же длины, что и выход хеш-функции. Соль должна быть
сохранена в таблице учетных записей пользователей вместе с хеш-кодом.
Сохранение пароля:
1. Генерируем длинную случайную соль, используя криптографически стойкий
генератор псевдослучайных чисел;
2. Присоединяем соль к паролю и вычисляем хеш-код с помощью стандартной
криптографической хеш-функции, например, SHA256;
3. Сохраняем и соль, и хеш-код в записи базы данных пользователей.
Проверка пароля:
1. Извлекаем соль и хеш-код пользователя из базы;
2. Добавляем соль к введенному паролю и вычисляем хеш-код с помощью той же
самой функции;
3. Сравниваем хеш-код введенного пароля с хеш-кодом из базы данных. Если они
совпадают, пароль верен. В противном случае, пароль введен неправильно.
~ 13 ~
пользователя с помощью JavaScript, или он должен быть отправлен на сервер
«открытым текстом» и захеширован там?
Даже если вы вычисляете хеш-код пользовательского пароля, используя
JavaScript, вы все равно должны произвести хеширование хеш-кодов на сервере.
Предположим, что веб-сайт производит вычисление хеш-кода паролей в
браузерах пользователей без хеширования хеш-кодов на сервере. Для
аутентификации пользователя этот веб-сайт будет принимать хеш-код от браузера, и
проверять, совпадает ли этот хеш-код с тем, что хранится в базе данных. Кажется, что
это более безопасно, чем просто хеширование на сервере, так как пароли
пользователей никогда не отправляются на сервер, но это не так.
Проблема в том, что хеш-код на стороне клиента по логике становится
пользовательским паролем. Все, что пользователю нужно сделать для
аутентификации, это указать серверу хеш-код своего пароля. Если бы хакер получил
хеш-код пользователя, он мог бы использовать его для аутентификации на сервере, не
зная пользовательского пароля!
Таким образом, если злоумышленник каким-то образом украдет базу данных
хеш-кодов с этого гипотетического веб-сайта, он получит непосредственный доступ к
учетной записи каждого пользователя без необходимости угадывать какой-либо
пароль.
А это не означает, что пользователю не следует вычислять хеш-код в браузере,
но если вы делаете это, вы обязаны производить хеширование и на сервере тоже.
Хеширование в браузере – это, определенно, хорошая идея, но учитывайте, что
Хеширование пароля на стороне клиента не замещает HTTPS (SSL/TLS).
Если соединение между браузером и сервером ненадежно, третья сторона может
изменить код JavaScript во время загрузки, чтобы удалить функцию хеширования и
получить пароль пользователя.
Поскольку вы хешируете и используете хорошую соль на сервере, то можно
использовать имя пользователя (или адрес электронной почты), конкатенированный
со специфичной для сайта строкой (например, именем домена) в качестве соли на
клиентской стороне.
~ 14 ~
Растяжение ключа реализуется при помощи специального типа хеш-функции,
нагружающей ЦПУ. Не пытайтесь изобрести свою собственную – простое
итеративное хеширование хеш-кода пароля не достаточно, так как оно может быть
распараллелено на аппаратном уровне и выполнено так же быстро, как и обычный
хеш-код.
Используйте стандартный алгоритм, такой как PBKDF2 или bcrypt. Реализацию
алгоритма PBKDF2 на PHP можно найти здесь.
Эти алгоритмы принимают в качестве аргумента коэффициент надежности или
счетчик итераций. Эта величина определяет, насколько медленной будет хеш-
функция.
Для настольного программного обеспечения или приложений для смартфонов
самый лучший способ выбрать этот параметр – это запустить короткий тест на
устройстве, чтобы найти величину, при которой хеш-код вычисляется примерно
полсекунды. Таким образом, ваша программа может быть максимально надежной, не
влияя на работу пользователя.
Если вы применяете хеширование растяжения ключа в веб-приложении, вы
должны знать, что вам потребуются дополнительные вычислительные ресурсы,
чтобы обрабатывать огромный объем запросов аутентификации, и что растяжение
ключа облегчает выполнение атак типа «отказ в обслуживании» (DoS) на ваш сайт.
Оптимальным считается использование процедуры растяжения ключа, но с
небольшим значением счетчика итераций. Вам нужно вычислить счетчик итераций,
основываясь конкретно на ваших вычислительных ресурсах и на ожидаемой
максимальной скорости запросов на проверку подлинности.
Угроза отказа в обслуживании может быть устранена, если заставить
пользователей вводить капчу каждый раз, когда они входят в учетную запись. Всегда
проектируйте вашу систему так, чтобы счетчик итераций мог быть увеличен или
уменьшен в будущем.
Если вы волнуетесь насчет вычислительной нагрузки, но все еще хотите
использовать растяжение ключа в веб-приложении, рассмотрите выполнение
алгоритма растяжения ключа в пользовательском браузере с помощью
JavaScript. Stanford JavaScript Crypto Library включает в себя PBKDF2.
Счетчик итераций должен быть установлен достаточно небольшим, чтобы
система могла использоваться с более медленными клиентами, такими как
мобильные устройства. Также система должна передавать вычисления серверу, если
пользовательский браузер не поддерживает JavaScript.
Растяжение ключа на стороне клиента не отменяет необходимость хеширования
на сервере. Вы должны хешировать хеш-код, сгенерированный клиентом так же, как
если бы хешировали обычный пароль.
~ 15 ~
хеш-код с помощью алгоритма имитовставки, например HMAC (хеш-код
аутентификации сообщений).
Это не так легко, как кажется. Ключ нужно держать в секрете от
злоумышленников, даже в случае взлома. Если злоумышленник получает полный
доступ к системе, он будет способен украсть ключ вне зависимости от того, где он
сохранен.
Ключ должен быть сохранен во внешней системе, такой как физически
изолированный сервер, выделенный для проверки паролей, или на специальном
устройстве, подключенному к серверу, например, YubiHSM.
Если вы не можете позволить себе несколько выделенных серверов или
специальные аппаратные устройства, вы все равно можете получить некоторую
пользу от имитовставки на стандартном веб-сервере.
Большинство баз данных взламываются с помощью атак SQL-инъекциями,
которые, в большинстве случаев, не дают злоумышленникам доступ к локальной
файловой системе (отключите доступ на вашем SQL сервере к локальной файловой
системе, если он поддерживает такую функцию).
Если вы сгенерируете случайный ключ и сохраните его в файле, к которому нет
доступа из Интернета, и включите его в «соленые» хеш-коды, то эти хеш-коды не
будут уязвимы, даже если ваша база данных будет взломана с использованием
простой атаки SQL-инъекциями.
Не прописывайте ключ в исходном коде, генерируйте его случайным образом,
когда приложение установлено. Это не так надежно, как использование отдельной
системы для вычисления хеш-кода паролей, потому что, если в веб-приложении есть
уязвимости к SQL-инъекциям, вероятно, существуют и другие виды уязвимостей,
такие как подключение к локальному файлу, которые злоумышленник мог бы
использовать для чтения файла с секретным ключом. Но лучше это, чем ничего.
Пожалуйста, обратите внимание, что имитовставка не избавляет от
необходимости использования соли. Умные злоумышленники в конечном итоге
найдут способы скомпрометировать ключи, поэтому важно, чтобы хеш-коды были
дополнительно защищены солью и растяжением ключа.
~ 16 ~
Также важно проводить мониторинг вашего сайта, чтобы обнаружить нарушение
безопасности, если это произошло.
Если нарушение не было обнаружено, злоумышленник может через ваш сайт
заражать компьютеры посетителей вредоносными программами, поэтому
чрезвычайно важно, чтобы бреши в безопасности были обнаружены и устранены
максимально быстро.
http://www.convertstring.com/ru/Hash
2. Практическая часть
~ 17 ~
2.3. Вопросы по разделу
~ 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 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 ~