Кстати, о паролях

Мне тут вчера о паролях напомнили.. Так у меня вопрос есть про хранение пользовательских паролей на сервере.

Обычным способом является хранение хэша от пароля с приклеенной солью и самой соли открытым текстом. Иногда ещё используется дополнительная соль,  индивидуальная для экземпляра системы. Но суть в том, что хэш от всего этого считается один раз.

А в одном из веб-движков используется такая схема: hash(hash(password) . salt).

Вопрос: в чём смысл двойного хэширования?

С точки зрения защиты от поиска известного пароля в похищенной базе оно принципиально не лучше однократного хэша. Первый хэш (или пачка хэшей для словарных паролей) всё равно считается только один раз, а дальше трудоёмкость такая же, как для однократного хэширования.

С точки зрения подбора пароля по известному хэшу и соли – да, трудоёмкость операции увеличивается вдвое, но стоит ли овчинка выделки?

Умный человек [ljuser]ivlad[/ljuser] предположил, что это делается для защиты от атаки с помощью предварительно рассчитанных “недохэшей”. Скажем, для мд5 длина блока данных 512 бит (64 байта). А пароли, даже вместе с солью, обычно сильно короче. Соответственно, при однократном хэшировании большая часть блока данных имеет известные значения, что позволяет применять некоторые атаки, сокращающие время подбора. А при использовании вышеуказанной схемы для второго хэширования будет взято 16 байт данных (или 32, если использовать текстовое представление) + соль. Всё ж побольше первоначального пароля. Фактически это получилась такая зачаточная PBKDF, увеличивающая длину ненулевых данных перед финальным хэшированием. Закат солнца вручную вместо использования проверенного профессионалами способа.

А ещё у кого-нибудь есть мысли, зачем это могло быть сделано?

This entry was posted in Uncategorized and tagged , . Bookmark the permalink.

Leave a Reply