Возможный дубликат:
Безопасный хэш и соль для паролей PHP
Я делаю сайт, и мне нужен безопасный алгоритм для хранения паролей. Сначала я думал о bcrypt, но потом узнал, что мой хост не поддерживает его, и я не могу изменить хост.
Мой хост разрешает это шифрование:
И эти хеши:
Итак, может ли кто-нибудь из вас исправить хороший алгоритм с этим и солью, пожалуйста?
Вы не должны хранить зашифрованные (или даже незашифрованные) пароли вообще. Вместо этого используйте соленые хеши (растянутые, например, с PBKDF2 ), предпочтительно SHA2-512.
Для справки, вот классификация перечисленных хешей (см. Wikipedia для деталей):
Шифрование (не хэш-функция): DES
Некриптографические контрольные суммы (смешно) : adler32, crc32, crc32b
Разбито : MD2, MD4, MD5, SHA1
Вероятно, сломан : Тигр, снефру, ГОСТ, ГАВАЛ *
Вероятно безопасно : SHA2-256 / 384/512, RIPEMD-128/256, RIPEMD-160/320, WHIRLPOOL
Обратите внимание, что сила относится к атаке поиска любого пароля, который соответствует известному хешу (атака прообразом). Кроме того, вышеупомянутая сортировка параноидально, мгновенно отбрасывая любой хэш с любыми известными уязвимостями.
crc32, adler32 и т. д. не предназначены для криптографической защиты – они просто быстрые алгоритмы контрольной суммы. Я думаю, что соленый SHA-256 должен предлагать хорошее сочетание безопасности и совместимости.
На несколько менее серьезной ноте, я когда-то вспоминаю использование соленого MD5 на медленном сервере, который, как ожидалось, обеспечивал бы умеренную нагрузку. Поэтому я решил поместить его с 32-битной случайной солью и сохранил все это как шестнадцатеричное – это создало впечатление, что все это было несоленого SHA-1. Я искренне надеюсь, что кто-то потратил драгоценное время на радужные столы на украденной свалке!
Безопасность на самом деле не все о более дорогостоящем хэшировании 🙂
Вам следует
Вы должны хранить пароли как хэши, как указано выше, а не зашифрованы.
Хэш-функция в основном является односторонним преобразованием, которое всегда производит один и тот же хеш для одного и того же входного аргумента. Невозможно преобразовать хэш обратно в исходную форму, или хеш-функцию следует считать сломанной.
Шифрование – это двухстороннее преобразование, в котором вы можете преобразовать зашифрованные данные обратно в исходную форму, если у вас есть ключ.
Сохраняя пароли как хэши, и поскольку они преобразуются одним способом, они не могут быть извлечены, даже если кто-то должен получить базу данных.
При проверке пароля просто преобразуйте его с помощью той же самой функции хеширования, которую вы использовали на вашем сохраненном пароле и проверите против базы данных.
Как сказал гнур, вам нужно решить, хотите ли вы хешировать или шифровать пароли. Если это пароли для ваших собственных пользователей, и пароли используются только в вашей системе, то используйте их с помощью соли и растяжения. Из хэш-алгоритмов вы можете использовать SHA-256 или SHA-512. Для соли используют 128 случайных бит (16 байт). В идеале используйте криптографический RNG, хотя не криптовальный RNG будет делать это в крайнем случае. Предполагается, что атакующий знает соли. Достаточно растянуть, что для обработки одного пароля требуется около 0,1 секунды. Это позволяет любому злоумышленнику совершать десять попыток разбить пароль каждую секунду.
Если вы храните пароли для входа в внешнюю систему, вам необходимо будет зашифровать пароли и расшифровать их при необходимости. DES – ваш единственный реальный вариант здесь, если у вас также нет доступных 3DES (aka Triple DES или DESede). Я удивлен, что AES / Rijndael недоступен. Если это тогда, мы предпочитаем DES.