Какая разница между bcrypt и хэшированием несколько раз?

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

ТТД

Ответ 4

Хотя на этот вопрос уже дан ответ, я хотел бы указать на тонкую разницу между 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 более безопасным, чем простой хэширующий цикл.

Ответ 5

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

OrpheanBeholderScryDoubt

64 раза.

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