В чем разница между bcrypt и хэшированием несколько раз? - PullRequest
14 голосов
/ 16 августа 2011

Как bcrypt сильнее, чем, скажем,

def md5lots(password, salt, rounds):
    if (rounds < 1)
        return password
    else
        newpass = md5(password + salt)
        return md5lots(newpass, salt, rounds-1)

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

Ответы [ 5 ]

4 голосов
/ 22 августа 2011

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

Когда вы проверяете данные, вам нужна скоростьпотому что вы хотите проверить данные как можно быстрее.

Когда вы пытаетесь защитить учетные данные, скорость работает против вас.Злоумышленник с копией хэша пароля сможет выполнить гораздо больше атак с использованием грубой силы, потому что MD5, SHA1 и т. Д. Дешевы в исполнении.

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

3 голосов
/ 19 августа 2011

Существует три существенных различия между bcrypt и хэшированием несколько раз с MD5:

  1. Размер вывода: 128 бит (16 байт) для MD5 и 448 бит (56 байт) для bcrypt. Если вы храните миллионы хэшей в базе данных, это необходимо учитывать.
  2. Столкновения и прообразные атаки возможны против MD5.
  3. Bcrypt может быть настроен на итерацию все больше и больше, поскольку процессоры становятся все более и более мощными.

Следовательно, использование соления и растяжения с MD5 не так безопасно, как использование bcrypt. Эту проблему можно решить, выбрав лучшую хеш-функцию, чем MD5.

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

1 голос
/ 14 сентября 2012

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

Вы вычисляете хеш-значение, а затем используете результат для вычисления следующего хеш-значения.Если вы посмотрите на реализацию BCrypt, вы увидите, что каждая итерация использует результирующее хеш-значение, а также оригинальный пароль (ключ).

Eksblowfish(cost, salt, key)
  state = InitState()
  state = ExpandKey(state, salt, key)
  repeat (2^cost)
    state = ExpandKey(state, 0, key)
    state = ExpandKey(state, 0, salt)
  return state

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

1 голос
/ 19 августа 2011

Вы фактически говорите о реализации PBKDF2 или функции получения ключа на основе пароля. По сути, это то же самое, что BCrypt, преимущество в том, что вы можете увеличить количество процессорного времени, которое требуется для получения пароля. Преимущество этого по сравнению с чем-то вроде BCrypt состоит в том, что, зная, сколько «итераций» вы пропустили, пароль, когда вам нужно его увеличить, вы можете сделать это без сброса всех паролей в базе данных. Просто сделайте так, чтобы ваш алгоритм взял конечный результат, как если бы он был на n-й итерации (где n - предыдущий счетчик изменений), и продолжайте!

Рекомендуется использовать правильную библиотеку PBKDF2 вместо создания собственной, потому что, как со всей криптографией, давайте посмотрим правде в глаза, единственный способ узнать, является ли что-то безопасным, если это было «проверено» межсетями. (см. здесь )

Системы, использующие этот метод:
В .NET уже реализована библиотека. Смотри здесь
Для шифрования файлов в Mac, Linux и Windows используется множество версий этого метода шифрования (более 10 000+) для защиты своих файловых систем.
Сети Wi-Fi часто защищены с помощью этого метода шифрования
Источник

Спасибо за вопрос, это заставило меня исследовать метод, который я использовал для защиты своих паролей.

TTD

0 голосов
/ 04 мая 2012

Строго говоря, bcrypt фактически шифрует текст:

OrpheanBeholderScryDoubt

64 раза.

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

...