Мне тут вчера о паролях напомнили.. Так у меня вопрос есть про хранение пользовательских паролей на сервере.
Обычным способом является хранение хэша от пароля с приклеенной солью и самой соли открытым текстом. Иногда ещё используется дополнительная соль, индивидуальная для экземпляра системы. Но суть в том, что хэш от всего этого считается один раз.
А в одном из веб-движков используется такая схема: hash(hash(password) . salt).
Вопрос: в чём смысл двойного хэширования?
С точки зрения защиты от поиска известного пароля в похищенной базе оно принципиально не лучше однократного хэша. Первый хэш (или пачка хэшей для словарных паролей) всё равно считается только один раз, а дальше трудоёмкость такая же, как для однократного хэширования.
С точки зрения подбора пароля по известному хэшу и соли – да, трудоёмкость операции увеличивается вдвое, но стоит ли овчинка выделки?
Умный человек ivlad предположил, что это делается для защиты от атаки с помощью предварительно рассчитанных “недохэшей”. Скажем, для мд5 длина блока данных 512 бит (64 байта). А пароли, даже вместе с солью, обычно сильно короче. Соответственно, при однократном хэшировании большая часть блока данных имеет известные значения, что позволяет применять некоторые атаки, сокращающие время подбора. А при использовании вышеуказанной схемы для второго хэширования будет взято 16 байт данных (или 32, если использовать текстовое представление) + соль. Всё ж побольше первоначального пароля. Фактически это получилась такая зачаточная PBKDF, увеличивающая длину ненулевых данных перед финальным хэшированием. Закат солнца вручную вместо использования проверенного профессионалами способа.
А ещё у кого-нибудь есть мысли, зачем это могло быть сделано?
Оригинал этой записи. Комментировать можно тут или там.