Действительно, я думаю, что более основная проблема заключается в том, что вы храните пароли так, чтобы их можно было восстановить. В течение многих лет считалось, что гораздо лучше хранить хеш пароля в сочетании со значением «соли».
Идея в том, что вы:
- Возьмите пароль пользователя, указанный при первоначальной регистрации или с помощью функции «изменить свой пароль», и добавьте к нему некоторое количество случайных байтов («соль»);
- Поместить случайные байты и пароль пользователя через криптографически безопасную хеш-функцию; Проверьте текущую литературу, чтобы увидеть, что использовать (SHA-1? Я не знаю, что лучше на данный момент, февраль 2012). Затем сохраните хешированный пароль плюс случайные «соленые» байты в базе данных. Соляные байты должны быть в виде простого текста; Их задача - сделать «радужную таблицу» из миллиардов возможных паролей менее практичной.
- Чтобы проверить пароль пользователя при аутентификации, добавьте (или добавьте, в зависимости от случая) сохраненное солт-значение пользователя (доступное по заявленному имени пользователя) к предоставленному предполагаемому паролю и примените ту же хеш-функцию. Если результат хеширования соответствует сохраненному хешу, то пользователь предоставил правильный пароль.
Я не специалист по криптографии, поэтому я бы посоветовал вам (или всем, кто читает это) провести дополнительные исследования новейших методов и лучших практик. Например, в последние годы было выдумано несколько интересных атак против этих схем, связанных с определенным временем выполнения операций. Таким образом, сейчас лучше убедиться, что ваш ответ на неудачные (и, возможно, успешные!) Пароли связан с некоторой случайной задержкой. Даже это может быть предметом спора, если ваш злоумышленник может (для, возможно, дико наглядного примера) контролировать энергопотребление ваших серверов! Это страшный мир.