Предположим, вы были вправе решить, как хешированные пароли должны храниться в СУБД. Существуют ли очевидные недостатки в схеме, подобной этой?
Чтобы создать хеш-значение, хранящееся в СУБД, выполните:
- Значение, уникальное для экземпляра сервера СУБД как часть соли,
- И имя пользователя как вторая часть соли,
- И создайте конкатенацию соли с фактическим паролем,
- И хэш всей строки с использованием алгоритма SHA-256,
- И сохраните результат в СУБД.
Это означало бы, что любой, кто хочет столкнуться с столкновением, должен выполнять работу отдельно для каждого имени пользователя и каждого экземпляра сервера СУБД отдельно. Я планировал бы сохранить фактический хеш-механизм несколько гибким, чтобы использовать новый алгоритм хеширования NIST (SHA-3), который все еще обрабатывается.
Значение, уникальное для экземпляра сервера СУБД, не обязательно должно быть секретным, хотя оно не будет разглашено случайно. Цель состоит в том, чтобы убедиться, что если кто-то использует один и тот же пароль в разных экземплярах сервера СУБД, записанные хэши будут разными. Точно так же имя пользователя не было бы секретным - только собственно пароль.
Будет ли преимущество в том, что сначала будет пароль, а также имя пользователя и "уникальное значение" или любая другая перестановка трех источников данных? Или как насчет чередования строк?
Нужно ли добавлять (и записывать) случайное значение соли (за пароль), а также информацию выше? (Преимущество: пользователь может повторно использовать пароль и, вероятно, получить другой хэш, записанный в базе данных. Недостаток: соль должна быть записана. Я подозреваю, что преимущество значительно перевешивает недостаток.)
Существует довольно много связанных вопросов SO - этот список вряд ли будет всеобъемлющим:
- Шифрование/Хеширование простых текстовых паролей в базе данных
- Защищенный хэш и соль для паролей PHP
- Необходимость скрывать соль для хеша
- Хеш MD5 со стороны клиента
- Простое шифрование пароля
- Соль и программное обеспечение с открытым исходным кодом
- Хеши паролей: бинарные поля фиксированной длины или однострочное поле?
Я думаю, что ответы на эти вопросы поддерживают мой алгоритм (хотя, если вы просто используете случайную соль, то "уникальное значение для каждого сервера" и компоненты имени пользователя менее важны).