Bcrypt як заміна хешування md5

Навіщо взагалі хешірованного паролі?

В останні дні на Хабре з'явилися повідомлення про те, що бази з хешамі паролів популярних сервісів потрапляють до рук зловмисників (1), (2). Стає відомо, що сервіс linked.in використовує метод хешування SHA-1, а last.fm використовує MD5. Більшість паролів представляють собою короткі словникові слова, а значить зловмисник, маючи хеш, зможе знайти вихідний пароль навіть без брутфорса, просто скориставшись райдужними таблицями.
Це серйозне порушення безпеки, незважаючи на те, що багато розробників вважають, що збереження хеша пароля замість самого пароля здатне захистити користувачів сервісу в разі витоку бази даних. Безумовно, це набагато краще, ніж зберігати паролі у відкритому вигляді, але, очевидно, недостатньо безпечно. Метод BCrypt, на відміну від MD5 і SHA-1 не дуже відомий на просторах рунета, в російськомовній вікіпедії навіть немає статті про нього. Що ж він собою являє?

Що таке BCrypt?

BCrypt це алгоритм криптографічного хешування, який використовує метод шифрування Blowfish. Він використовує секретний ключ K (Key Factor), що дозволяє налаштовувати якість шифрування, і це виділяє його серед інших алгоритмів хешування. Можливість підвищити криптостойкость в майбутньому, коли комп'ютери стануть набагато більш потужними, означає, що цей алгоритм може бути використаний без оглядки на зростаючу потужність процесорів і розміри обчислювальних ферм.

Повільно не означає погано

BCrypt працює набагато повільніше інших методів хешування, але його результат захищений набагато сильніше. Адже коли справа стосується хешування та шифрування, швидше не означає краще. Чим більше часу займає шифрування, тим довше буде тривати розшифровка. Популярний метод MD5 обчислюється настільки швидко, що на звичайному ноутбуці можна обчислювати десятки тисяч хеш в секунду. А на потужному сервері - сотні тисяч і мільйони! Вся краса і лаконічність цього методу безсила перед простим брутфорсом.

Чому б не використати сіль?

Стандартна функція знаходження хеша MD5 має такий вигляд:
MD5 (password)
Від слова, що є паролем, обчислюється хеш, який і буде зберігатися в базі даних. Коли користувач захоче залогінитися, від його пароля буде знову обчислений хеш і сравнён з тим, який лежить в основі. Якщо хеші збігаються, значить паролі теж збігаються, і користувачеві дозволяється увійти. Якщо зловмисник відведе базу з хешамі паролів, то він, використовуючи райдужні таблиці, швидко знайде прості паролі, хеши яких там уже є.

Функція знаходження хеша MD5 з сіллю має, наприклад, такий вигляд:
MD5 (MD5 (password) + salt)
Спочатку знаходиться хеш слова, що є паролем. До цього хешу дописується сіль (випадковий набір симолів, унікальний для кожного користувача) і від поєднання «хеш пароля + сіль» знову знаходиться хеш, який буде зберігатися в базі даних. Сіль зберігається в тій же базі даних і використовується для обчислення хеша кожен раз, коли користувач логинится.
Тепер, якщо зловмисник відведе вашу базу з хешамі, райдужні таблиці йому вже не допоможуть, тому що по них можна шукати лише хеші словникових слів або наборів цифр. В такому випадку зловмисник, швидше за все, скористається брутфорсом. Маючи на руках хеш і сіль, озброївшись швидким процесором, він буде підбирати хеші до тих пір, поки не отримає збіг.

Що вирішить проблему?