Загалом, вам не потрібно використовувати більше ніж один алгоритм хешування.
Що вам потрібно зробити:
Використовуйте сіль: сіль не використовується лише для того, щоб зробити ваш пароль більш безпечним , вона використовується для відмови від атаки на райдужну таблицю. Таким чином, комусь доведеться посилити роботу, намагаючись попередньо обчислити хеш для паролів, які ви зберігаєте у вашій системі.
Використання декількох interations: замість того, щоб робити тільки SHA (пароль + сіль), зробіть SHA (SHA (SHA (SHA (SHA (... SHA (пароль + сіль)))))). Або представити іншим способом:
hash = sha(password + salt)
for i=1 , i=5000, i++ {
hash = sha(hash + salt);
}
І, нарешті, виберіть хорошу функцію хешування. SHA, MD5 тощо не є хорошими, оскільки вони занадто швидкі . Оскільки ви хочете використовувати хеш для захисту, краще використовувати повільні хеші. Погляньте, наприклад, на Bcrypt , PBKDF2 або Scrypt .
редагувати : після спостережень давайте спробуємо побачити деякі моменти (вибачте, довге пояснення, щоб дійти до кінця, оскільки це може допомогти іншим шукати подібні відповіді):
Якщо ваша система захищена, як ніхто ніколи не отримає доступ до збереженого пароля, вам не потрібен хеш. Пароль був би секретним, його ніхто не отримає.
Але ніхто не може запевнити, що база даних із паролями буде вкрадена. Викрали базу даних, отримали всі паролі. Гаразд, ваша система та ваша компанія понесуть усі наслідки. Отже, ми могли б спробувати уникнути протікання цього пароля.
Зверніть увагу, що нас не турбують інтернет-атаки. Для однієї атаки в Інтернеті найкращим рішенням є гальмування помилкових паролів, блокування облікового запису після деяких спроб і т. Д. І для цього не важливо, в який спосіб ви шифруєте, хешуєте, зберігаєте тощо свій пароль. Інтернет-атака - це питання сповільнення введення пароля .
Отже, повернемося до don't let them take my plain passwords
проблеми. Відповідь проста: не зберігайте їх як звичайний текст. Добре, зрозумів.
Як цього уникнути?
Зашифруйте пароль (?). Але, як відомо, якщо ви зашифруєте його, ви можете розшифрувати його назад, якщо у вас є належний ключ. І у вас виникне проблема "куди сховати" ключ. Гум, нічого доброго, оскільки вони отримали вашу базу даних, вони можуть отримати ваш ключ. Гаразд, не будемо ним користуватися.
Отже, ще один підхід: давайте перетворимо пароль у щось інше, що неможливо змінити і зберегти. І щоб переконатися, що наданий пароль правильний, ми знову робимо той самий процес і перевіряємо, чи відповідають ці два перетворені значення. Якщо вони відповідають = хороший пароль був наданий.
Добре, поки що добре. Давайте в паролі використаємо хеш MD5. Але ... якщо хтось має збережене хешоване значення пароля, у нього може бути багато комп’ютерної потужності, щоб обчислити хеш MD5 кожного можливого пароля (груба сила), тому він може знайти оригінальний пароль. Або, що ще гірше, він може зберігати весь MD5 з усіх комбінацій символів та легко знаходити пароль. Отже, зробіть багато ітерацій, HASH (HASH (HASH ())), щоб зробити це складніше, тому що це займе більше часу.
Але навіть це можна обійти кругом, веселковий стіл був створений саме для того, щоб прискорити подібний захист.
Отже, давайте використати трохи солі над цим. Таким чином, при кожній взаємодії сіль використовується знову. Кожен, хто намагається атакувати ваші паролі, повинен створити таблицю веселки, враховуючи, що сіль додається щоразу. І коли він генерує цю таблицю веселки, оскільки вона була створена з однією сіллю, йому доведеться знову обчислити з іншою сіллю, тому йому доведеться витратити деякий час на кожен пароль (= кожна сіль). Сіль не додасть «більшої складності» паролю, це просто змусить зловмисника втратити час, створюючи таблицю веселки, якщо ви використовуєте одну сіль для кожного пароля, стіл з однієї солі марний іншим паролем.
І використання більше одного хеша допоможе тут? Ні. Людина, яка генерує певну атаку веселки, у будь-якому випадку зможе генерувати її за допомогою одного або декількох хешей.
І використання більше одного хешу може призвести до однієї проблеми: це так само безпечно, як і найслабший хеш, який ви використовуєте. Якщо хтось знайде зіткнення в одному алгоритмі хешу, саме той хеш буде використаний в будь-якій точці процесу ітерації, щоб зламати пароль. Отже, ви нічого не отримуєте, використовуючи більше алгоритмів хешей, краще вибрати лише один хороший альго. і використовувати його. І якщо ви коли-небудь почуєте, що це було порушено, подумайте, як ви це зміните у своїй заяві.
І навіщо використовувати bcrypt чи щось подібне (ви кажете, що ви його використовуєте): тому що зловмиснику доведеться витрачати більше часу на створення таблиць. Ось чому використання MD5 + зачекання (3 секунди) не допомагає: атака все одно буде відключена, тому зловмисник може генерувати таблиці без (затримки на 3 секунди).