Хеширование и аутентификация
Хеширование
Хеш-функциями в информатике называются функции, получающие на вход данные произвольного размера и выдающие результат фиксированного размера.
Для хеш-функций, используемых в криптографии, характерна однонаправленность. Это означает, что для данного результата затруднительно подобрать входные данные, дающие такой результат.
Есть некоторое количество широкоиспользуемых хеш-функций: MD5, SHA-1, SHA-2, SHA-3 (перечислены в порядке возрастания «надёжности» — сложности подбора входных данных по результату) и некоторые другие.
На хешировании основаны две распространённые схемы цифровой подписи:
- симметричная («имитовставка», также именуемая кодом аутентификации сообщения или Message Authentication Code)
- асимметричная, которую мы кратко описали в предыдущем разделе и более подробно опишем в следующем
Аутентификация сообщений
Аутентификацией сообщения называется проверка этого сообщения на аутентичность: факт того, что проверяемое сообщение написано именно его автором, а не тем, кто выдаёт себя за этого автора.
Сейчас мы разберём классическую симметричную схему. Напомним, что этим термином называются схемы, в которых дешифровку (или, в нашем случае, — проверку аутентичности) может осуществлять лишь ограниченный круг лиц, наделённых секретным ключом.
При этом отметим, что чаще всего в аутентификации по симметричной схеме участвует вообще одно лицо — сам автор сообщения: это позволяет отдавать такое сообщение на хранение кому-то другому без боязни, что оно будет модифицировано.
Подпись
Для того, чтобы сделать сообщение аутентифицированым, его сопровождают подписью, которая в нашем случае называется кодом аутентификации сообщения.
Рассмотрим две часто используемые на практике схемы подписи:
- простая: сообщение соединяется с секретным ключом, после чего хешируется
- «HMAC» результат простой схемы опять соединяется с секретным ключом, после чего хешируется
Чаще всего простая схема достаточно адекватна. Классическая атака на эту схему основана на произвольности формата сообщения, но большинство сообщений, которые в реальности подписываются подобным образом, имеют строго заданный формат, устойчивый к подобным атакам (впрочем, известны реальные случаи успешного применения таких атак к форматированным сообщениям; связанные, правда, с неадекватностью процедуры проверки формата).
Более же сложная схема HMAC считается более надёжной и рекомендуется для применения в промышленных ситуациях вместо «простой».
Хранение паролей
По очень похожей схеме устроены хранение и проверка паролей: обычно сами пароли нигде не хранятся (это чревато тем, что базы с данными пользователей обычно почти не защищены от утечек, а люди имеют тенденцию использовать один и тот же пароль в большом количестве разных мест), а хранятся коды аутентификации этих паролей.
При этом, для того, чтобы одинаковые пароли давали разные коды аутентификации, каждый пароль дополнительно модифицируется так называемой солью, которая выбирается случайным образом и хранится в паре с кодом аутентификации.
То есть, разница с обычной аутентификацией сообщения лишь в том, что сообщение собирается из двух частей:
- той, что хранится в базе данных пользователей (соль)
- той, что предоставляет сам пользователь (пароль)
В принципе, ничто не мешает, как и в классической схеме, отдать пользователю на хранение и соль вместе с кодом аутентификации, только вряд ли типичный пользователь типичного сервиса сможет всё это запомнить и правильно передать сервису при необходимости входа. А хранить это в файле часто оказывается не слишком надёжным решением (как и хранить пароль на листочке, приклеенном к монитору).