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

Пароли веб-приложений: bcrypt и SHA256 (и scrypt)

Со всеми недавними (например, LinkedIn) обсуждениями паролей я ищу варианты хэширования паролей. После двух чашек кофе и утреннего чтения я больше не криптограф, чем когда начал. И я действительно не хочу притворяться, что я есть.

Конкретные вопросы

  • Используется ли целочисленный уникальный идентификатор пользователя в качестве эффективной соли? (crypt() использует только 16 бит?)

  • Если я просто запускаю sha256() для хэша снова и снова до тех пор, пока не будет использован второй, это приведет к победе над атаками грубой силы?

  • Если я должен задать эти вопросы, должен ли я использовать bcrypt?

Обсуждение/Объяснение:

Цель состоит в том, что если мой пользователь хэширует пароли, они просочились:

  • не будет "легко" взломать,
  • взломать один пароль не будет выставлять других пользователей, которые используют один и тот же пароль).

То, что я прочитал для # 1, - это то, что хэш-вычисление должно быть дорогостоящим - например, секунду или два, чтобы вычислить и, возможно, потребовать бит или память (чтобы сорвать аппаратное дешифрование).

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

Но, является ли он столь же эффективным подходом к времени съема, "переигрывая" результат sha256() столько раз, сколько необходимо, чтобы использовать несколько секунд, а затем сохранить итоговое количество циклов с хэшем для последующей проверки предоставленного пароль?

Для # 2 важно использовать уникальную соль для каждого пароля. То, что неясно, как случайная (или большая) соль должна быть. Если цель состоит в том, чтобы избежать всех, кто использует "mypassword", поскольку их пароль от одного и того же хэша недостаточно, чтобы просто сделать это?:

hash = sha256_hex( unique_user_id + user_supplied_password );

или даже это, хотя я не уверен, что он покупает мне что-нибудь:

hash = sha256_hex( sha256( unique_user_id ) + user_supplied_password );

Единственное преимущество, которое я могу видеть, используя идентификатор пользователя, кроме того, что я знаю, что он уникален, заключается в том, чтобы избежать необходимости сохранять соль вместе с хешем. Не так много преимуществ. Есть ли реальная проблема с использованием идентификатора пользователя в качестве соли? Не выполняет ли он # 2?

Я предполагаю, что если кто-то может украсть мои пользовательские хэшированные пароли, я должен предположить, что они могут получить все, что захотят, включая исходный код, генерирующий хэш. Итак, есть ли какая-либо польза для добавления дополнительной случайной строки (той же строки) к паролю перед хэшированием? То есть:

# app_wide_string = one-time generated, random 64 7-bit *character* string.
hash = sha256_hex( unique_user_id + app_wide_string + user_supplied_password );

Я видел, что это было предложено, но я не понимаю, что я получаю от этого за соль для каждого пользователя. Если кому-то захотелось напасть на атаку, они бы знали, что "app_wide_string" и использовать это при запуске атаки на словах, правильно?

Есть ли веская причина использовать bcrypt для того, чтобы перевернуть мой собственный, как описано выше? Может быть, тот факт, что я задаю эти вопросы, является достаточной причиной?

BTW - я просто приурочил существующую хеширующую функцию, которую у меня есть и на моем ноутбуке, и я могу генерировать около 7000 хэшей в секунду. Не так часто предлагаются две или две секунды.

Некоторые связанные ссылки:

используя sha256 как хэширование и соление с идентификатором пользователя

SHA512 против Blowfish и Bcrypt

Какова оптимальная длина для солида пользователя?

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

Используется ли целочисленный уникальный идентификатор пользователя в качестве эффективной соли? (crypt() использует только 16 бит?)

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

crypt просто сохраняет соль и хэш в одну строку вместе с алгоритмом для использования.