Давайте предположим, что используемая вами хеш-функция будет идеальной односторонней функцией.Затем вы можете просмотреть его выходные данные как «случайный оракул» , его выходные значения находятся в конечном диапазоне значений (2 ^ 128 для MD5).
Что произойдет, если вы примените хеш несколько раз?Выход будет оставаться в том же диапазоне (2 ^ 128).Это как будто ты говоришь "Угадай мое случайное число!"двадцать раз, каждый раз думая о новом числе - это не делает его сложнее или легче угадать.Нет более «случайного», чем случайного.Это не идеальная аналогия, но я думаю, что это помогает проиллюстрировать проблему.
Учитывая грубый пароль, ваша схема вообще не добавляет никакой безопасности.Хуже того, единственное, что вы могли бы «выполнить», - это ослабить безопасность, предоставив некоторую возможность использовать многократное применение хэш-функции.Это маловероятно, но по крайней мере гарантировано, что вы наверняка ничего не выиграете.
Так почему же до сих пор не все потеряно при таком подходе?Это из-за того, что другие высказались о тысячах итераций вместо всего лишь двадцати.Почему это хорошо, замедляя алгоритм?Это потому, что большинство злоумышленников будут пытаться получить доступ, используя словарь (или радужную таблицу , используя часто используемые пароли, надеясь, что один из ваших пользователей проявил небрежность, чтобы использовать один из них (я виноват, по крайней мере,Ubuntu сказал мне об установке). Но с другой стороны, негумано требовать от ваших пользователей запоминания, скажем, 30 случайных символов.
Вот почему нам нужна некоторая форма компромисса между легко запоминающимися паролями, но приВ то же время злоумышленникам будет трудно угадать их. Существуют две общие практики: соли и замедление процесса путем применения множества итераций некоторой функции вместо одной итерации. PKCS# 5 является хорошим примером для изучения.
В вашем случае применение MD5 20000 вместо 20 раз значительно замедлит злоумышленников, использующих словарь, поскольку каждый из их входных паролей должен будет пройти черезобычная процедура хеширования 20000 раз, чтобы быть спокойнойкак атака.Обратите внимание, что эта процедура не влияет на грубое принуждение, как показано выше.
Но почему использование соли все же лучше?Потому что даже если вы примените хеш-код 20000 раз, находчивый злоумышленник может предварительно вычислить большую базу паролей, хешируя каждый из них 20000 раз, эффективно создавая настраиваемую радужную таблицу, специально предназначенную для вашего приложения.Сделав это, они могут довольно легко атаковать ваше приложение или любое другое приложение по вашей схеме.Вот почему вам также необходимо сгенерировать высокую цену за пароль, чтобы сделать использование таких радужных таблиц нецелесообразным.
Если вы хотите быть действительно безопасным, используйте что-то вроде PBKDF2, показанное в PKCS # 5.