Почему MD5 для паролей — плохо?

Ранее этот алгоритм шифрования повсеместно использовался для хранения хешей паролей для веб приложений. На деле, подозреваю, что может все еще использоваться для хранения паролей на некоторых старых сайтах, писаных 7+ лет назад. В наше время, все говорят что MD5 стоит избегать, но никто адекватно не может объяснить почему 🙂

Начнем с того, что существует исследование IETF, в котором содержится следующая информация:

MD5 is no longer acceptable where collision resistance is required such as digital signatures. It is not urgent to stop using MD5 in other ways, such as HMAC-MD5; however, since MD5 must not be used for digital signatures, new protocol designs should not employ HMAC-MD5. Alternatives to HMAC-MD5 include HMAC-SHA256 [HMAC] [HMAC-SHA256] and [AES-CMAC] when AES is more readily available than a hash function.

https://tools.ietf.org/html/rfc6151

Вышесказанное приводит MD5 как не надежный алгоритм в следствии того, что он не устойчив к построению коллизий. (коллизия — случай, когда две разные фразы дают одинаковый хеш).

Но согласно исследованию, использование MD5 при генерации HMAC-хеша не является настолько критичным, чем когда используем простой MD5.

Ну и вторая причина — скорость

MD5 — это хеш общего назначения (туда же входят все SHA алгоритмы). Это значит что он очень быстр в рассчете. Скорость рассчета крайне высока на обычной машине — ~2 миллиона хешей в секунду. Составление радужной таблицы для определенного диапазона значений (узкий алфавит, фиксированная длинна, словарь, известная соль) может быть крайне быстрым, особенно на современных машинах, или архитектурах заточеных под блочные хеши.

Итого?

Уже первой причины достаточно для того чтобы отказаться от использования MD5 вообще где угодно, но какой алгоритм тогда выбрать для хеширования паролей? SHA2? Ответ — нет. MD5, SHA и многие другие алгоритмы это алгоритмы общего назначения. Они нужны только в случае, когда нужна именно высокая скорость генерации хеша, но в случае с паролем скорость нам не важна.

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

Если сравнивать скорость алгоритмов, то за ~1 секунду bcrypt выдает всего 22 хеша для разных исходных значений. В случае с sha256 количество сгенерированных хешей уже 1,382,511. У md5 и того больше: 2,572,539

Click to rate this post!
[Total: 0 Average: 0]

Вам также может понравиться

About the Author: deniskoronets

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *