В процессе построения того, что я хотел бы надеяться, является правильно спроектированным механизмом аутентификации, я наткнулся на множество материалов, в которых указано, что:
- пароли пользователей должны быть засолены
- используемая соль должна быть достаточно случайной и генерироваться для каждого пользователя
- ... следовательно, соль должна храниться вместе с записью пользователя, чтобы обеспечить проверку пароля пользователя
Я полностью согласен с первым и вторым пунктами, но кажется, что для последнего есть легкий обходной путь. Вместо того, чтобы делать эквивалент (псевдокод здесь):
salt = random();
hashedPassword = hash(salt . password);
storeUserRecord(username, hashedPassword, salt);
Почему бы не использовать хэш имени пользователя в качестве соли? Это дает область солей, которая хорошо распределена, (приблизительно) случайна, и каждая отдельная соль настолько сложна, насколько позволяет ваша функция соли. Более того, вам не нужно хранить соль в базе данных - просто восстановите ее во время аутентификации. Еще псевдокод:
salt = hash(username);
hashedPassword = hash(salt . password);
storeUserRecord(username, hashedPassword);
(Конечно, hash
в приведенных выше примерах должно быть чем-то разумным, например, SHA-512 или каким-то другим сильным хэшем.)
Мне кажется разумным, учитывая то, что (мало) я знаю о крипто, но тот факт, что это упрощение по сравнению с широко рекомендуемой практикой, заставляет меня задуматься, есть ли какая-то очевидная причина, по которой я сбился с пути, о которой я не знаю .
РЕДАКТИРОВАТЬ Некоторые, кажется, не понимают, что вопрос. Я ни в коем случае не предлагаю использовать соль. Ссылаясь на отредактированный ответ TheRook: я знаком со ссылками, отмеченными в этих CWE. Основной вопрос, который у меня возникает: почему хеш (имя пользователя) является предсказуемой солью?
РЕДАКТИРОВАТЬ 2 Спасибо всем, кто предоставил ответы; biffabacon прямо обратился к моему основному вопросу в своем 2-м абзаце (в основном, все, что вы можете сделать, чтобы максимизировать область использования солей и, следовательно, генерируемых хешированных паролей, хорошо), но в различных комментариях по этому вопросу есть много полезной информации.