Подтвердить что ты не робот

Лучшая практика для хеширования паролей - SHA256 или SHA512?

В настоящее время я использую SHA256 с солью для хеширования своих паролей. Лучше ли продолжать использовать SHA256 или я должен перейти на SHA512?

4b9b3361

Ответ 1

Переход на SHA512 вряд ли сделает ваш сайт более безопасным. Вам не следует писать собственную хэш-функцию. Вместо этого используйте существующую реализацию.

SHA256 и SHA512 представляют собой дайджесты сообщений, они были никогда, предназначенными для функций парольного хеширования (или вывода ключей). (Хотя дайджест сообщения может быть использован строительным блоком для KDF, например, в PBKDF2 с HMAC-SHA1.)

Функция хэширования паролей должна защищать от атак со словарями и радужных таблиц. Чтобы защититься от атак со словарями, схема хэширования пароля должна включать в себя коэффициент работы, чтобы сделать его таким же медленным, как и работоспособным.

В настоящее время лучшим вариантом является, вероятно, Argon2. Это семейство функций хэширования пароля выиграло конкурс Hash Hash в 2015 году.

Если Argon2 недоступен, единственная стандартизованная функция хэширования пароля или генерации ключа - это PBKDF2, который является старым стандартом NIST. Другие варианты, если использование стандарта не требуется, включают bcrypt и scrypt.

В Википедии есть страницы для этих функций:

Ответ 2

Об этом достаточно хорошо сказано, если вы спросите меня: https://stackoverflow.com/questions/3897434/password-security-sha1-sha256-or-sha512

У Джеффа был интересный пост и для хэширования: http://www.codinghorror.com/blog/2012/04/speed-hashing.html

Обратите внимание, что SHA512 намного медленнее вычислять, чем SHA256. В контексте безопасного хэширования это актив. Медленнее вычислять хэши означает, что требуется больше времени для вычисления, поэтому, если вы можете позволить себе вычислительную стоимость, SHA512 будет более безопасным по этой причине.

Ответ 3

SHA512 может быть значительно быстрее, если рассчитывать на большинстве 64-битных процессоров как 32-битную математику SHA256ses, операцию, которая часто немного медленнее.

Ответ 4

SHA256 по-прежнему одобрен NIST, но было бы неплохо изменить его на SHA512 или bcrypt, если вы можете.

Список утвержденных NIST хеш-функций на момент написания: SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256 и SHA3- 224, SHA3-256, SHA3-384 и SHA3-512, SHAKE128 и SHAKE256.

Смотрите https://csrc.nist.gov/projects/hash-functions

В зависимости от используемой операционной системы у вас, вероятно, нет доступа к хеш-функциям SHA3 или SHAKE.

Многие люди предпочитают bcrypt SHA512, но bcrypt также доступен только в некоторых операционных системах.

SHA512 будет доступен в вашей системе, а если нет, возможно, у вас такая старая система, что выбор алгоритма хеширования - это наименьшая из ваших проблем.

Одна из причин, по которой обычно предпочитают bcrypt, заключается в том, что bcrypt является настраиваемым - вы можете увеличить количество раундов (коэффициент работы), чтобы увеличить время, необходимое для взлома хэшей bcrypt.

Но SHA256 и SHA512 также настраиваются. Хотя по умолчанию 5000 раундов, вы можете указать больше, если хотите. 500000 требует от моего текущего компьютера около 0,45 секунд для расчета, что кажется допустимым.

например.:

password    required    pam_unix.so sha512 shadow rounds=500000 ...

Причиной перехода с SHA256 на SHA512 является то, что SHA256 нужно гораздо больше раундов, чтобы быть таким же безопасным, как SHA512, поэтому, хотя он и небезопасен, он менее безопасен.

Смотрите, например: https://medium.com/@davidtstrauss/stop-using-sha-256-6adbb55c608

Крипто меняется быстро, поэтому любой ответ, который вы получите, может оказаться ошибочным завтра, но текущее состояние дел таково, что хотя bcrypt, возможно, лучше, чем SHA512, SHA512 в порядке.

Если вы используете SHA512 "из коробки", используйте его (не SHA256) и не беспокойтесь о bcrypt или любом из семейства SHA3, пока они не станут стандартными для вашего дистрибутива.


Кроме того, у текущего ответа с самым высоким рейтингом есть ряд утверждений, которые либо неверны, либо вводят в заблуждение.

"Переход на SHA512 вряд ли сделает ваш сайт более безопасным".

Это вводит в заблуждение. Переход на SHA512 сделает ваш сайт немного более безопасным. SHA256 не так хорош, как SHA512, но и не ужасен. Нет ничего лучше, чем SHA512, который, вероятно, будет доступен в вашей системе. Bcrypt может быть лучше, но это не ясно, и bcrypt недоступен на многих системах. Семейство SHA3, вероятно, лучше, но оно также широко не доступно.

"SHA256 и SHA512 никогда не предназначались для хеширования паролей"

Это не верно. И SHA256, и SHA512 являются утвержденными алгоритмами хеширования NIST.

"Чтобы защититься от атак по словарю, схема хеширования паролей должна включать рабочий фактор, чтобы сделать его настолько медленным, насколько это работоспособно".

Это не верно. Высокий коэффициент работоспособности защитит от взлома хэша, но не от словарной атаки. Не существует рабочего фактора, который был бы достаточно низким, чтобы его можно было использовать, но достаточно высоким, чтобы защитить от атаки по словарю. Если ваш пароль является словарным словом, он попадет в словарную атаку. Защита от атаки по словарю позволяет не использовать пароли, которые можно найти в словарях.

На моем текущем ПК ограничение на количество раундов составляет 10 миллионов, что приводит к задержке в 8,74 секунды для каждого введенного пароля. Это достаточно долго, чтобы быть чрезвычайно болезненным, дольше, чем вы хотели бы использовать. Это достаточно долго, чтобы предотвратить атаку грубой силой - но решительный противник с хорошей установкой взлома и немного терпения мог бы все же перебрать словарь, если бы захотел.

"Функция хэширования паролей должна защищать от... радужных таблиц"

Это в лучшем случае вводит в заблуждение. Защита от радужных таблиц заключается в том, чтобы каждый пароль имел свою "соль". Это довольно стандартная практика в наши дни, и это происходит до вызова хэш-функции. (Солить означает добавление случайной строки к паролю перед хэшированием. Солт хранится вместе с паролем, поэтому это не секрет, но это означает, что даже если пользователь выбирает известный пароль, злоумышленник не может просто признать, что {этот хэш} принадлежит {этому паролю}, им все еще нужно взломать хэш.)

"В настоящее время лучшим выбором, вероятно, является Argon2. Это семейство функций хеширования паролей выиграло конкурс хэширования паролей в 2015 году".

Это неясно. Любая "новая" криптографическая функция может иметь неочевидные способы взлома, поэтому большинство людей предпочитают функции, которые широко используются. Кроме того, Argon2, вероятно, вам недоступен.

"Другие варианты, если использование стандарта не требуется, включают bcrypt и scrypt."

Это неясно. В какой-то момент scrypt считался лучшим bcrypt. Однако по разным причинам настроение перешло от сценария к bcrypt. Смотрите, например: https://blog.ircmaxell.com/2014/03/why-i-dont-recommend-scrypt.html

Повторим, что на данный момент SHA512 является хорошим выбором, как и bcrypt.

SHA512 одобрен NIST, а bcrypt - нет.

SHA512 почти наверняка будет доступен в вашей системе. Bcrypt может или не может быть.

Если оба в вашей системе, я бы, вероятно, рекомендовал bcrypt, но это закрытый вызов. Либо в порядке.