Это всего лишь обычнаю тест конструкция просто как пример поднабросал, под любой проект можно переиграть, не думаю что двойной md5 легко будет прогнать по словаю.
конфиг со здоровенной ключевой фразой, которую довеском подсунуть в формирование двойного md5, тогда уже перебор вообще окажется из роли фантастики
Нет, не из области фантастики. Проблема с md5 в том, что он слишком быстр. Двойное хеширование бесполезно (скорость вычисления хеша увеличивается незначительно) и доже вредит (вероятность коллизии увеличивается, но мы не про это сейчас, к паролям это слабо относится).
Длинная статическая соль (этот самый конфиг со здоровенной фразой) не решает проблему.
При написании алгоритмов аутентификации и безопасного хранения хешей нужно исходить из таких предположений: утекла вся БД и злоумышленнику известен алгоритм хеширования (сорцы тоже утекли).
Цель: получить plain-text пароль пользователя.
Что будет делать злоумышленник? Скармливает софту-брутфорсеру алгоритм хеширования и самый большой словарь, который может себе позволить, примерно в таком виде (как предложенный
Alligat0r вариант): md5(md5(STATIC_SALT.DICTIONARY_WORD)) и запускает брутфорс. Уже видите проблему с такой солью? Она статическая (одна на все пароль) и никак не влияет на брутфорс, он все еще чертовски быстр. При каждой итерации подбора софт ищет полученный хеш в бд. Есть такой? Ну вот, один пароль мы нашли. И так далее.
Что же делать? Не использовать статическую соль, а рандомизированную для каждого пользователя. Как её хранить? Да прямо рядом с хешем пароля. Это намного безопаснее. Почему? Рассмотрим тот же вариант: у хацкера так же есть БД и алгоритм генерации хеша. Как он будет брутфорсить: взять уникальную соль для каждой записи из таблицы юзеров. Прилепить к слову из словаря и сгенерировать хеш: md5(md5(RANDOMIZED_SALT.DICTIONARY_WORD)). Проверить, что полученные хеши не совпадают. Взять следующее слова из словаря... Я думаю что уже стало очевидно, что в первом случае нужно сделать n итераций, где n -- размер словаря. Во втором уже Nn, где N - общее кол-во записей в таблице юзеров. Другими словами, при наличии словаря на 1000000 (миллион) парольных фраз и 1000 юзеров злоумышленник переберет 1000000 хешей (что для md5 очень быстро), а во втором уже 1000 * 1000000 = 1000000000 (миллиард) итераций! Что уже усложняет жизнь.
Но не делает эту задачу невозможной при наличии GPU
И таки что делать? Все просто, вот алгоритм успеха: уникальная рандомизированная для каждого юзера соль, более требовательный к вычислительным ресурсам алгоритм хеширования, нежели md5: блоуфиш с адекватным кост-фактором и уникальной солью обломает хацкеру зубы (что как раз и реализует PHP password api, к слову).