По-перше, кілька важливих термінів:
Хешинг - акт прийняття рядка та створення послідовності символів, які неможливо повернути до початкового рядка.
Симетричне шифрування - (зазвичай його також називають «шифруванням») - акт прийняття рядка та створення послідовності символів, які можна розшифрувати до початкового рядка, використовуючи той самий ключ шифрування, який його зашифрував.
Таблиця веселки - таблиця пошуку, яка містить усі варіанти хешированих символів у певному алгоритмі хешування.
Сіль - відомий випадковий рядок, доданий до початкового рядка до його хешування.
Для .NET Framework Bcrypt ще не має перевіреної посилання. Це важливо, оскільки немає можливості дізнатися, чи є серйозні недоліки в існуючій реалізації. Ви можете отримати реалізацію BCrypt для .NET тут . Я не знаю достатньо про криптографію, щоб сказати, чи це хороша чи погана реалізація. Криптографія - це дуже глибоке поле. Не намагайтеся створити власний алгоритм шифрування . Серйозно.
Якщо ви збираєтеся реалізувати власну безпеку пароля (зітхання), то вам потрібно зробити кілька речей:
- Використовуйте відносно безпечний алгоритм хешування .
- Соліть кожен пароль перед тим, як хешировать його.
- Використовуйте унікальну та довгу сіль для кожного пароля та зберігайте сіль із паролем.
- Потрібні надійні паролі .
На жаль, навіть якщо ви все це зробите, рішучий хакер все-таки потенційно міг розібратися в паролях, це зайняло б його дуже довго. Ось ваш головний ворог: час .
Алгоритм bcrypt працює, оскільки для хешування пароля потрібно п'ять порядків більше, ніж MD5 ; (і все ж набагато довше, ніж AES або SHA-512). Це змушує хакера витратити набагато більше часу на створення веселкової таблиці для пошуку ваших паролів, що робить набагато меншою ймовірність того, що ваші паролі будуть під загрозою злому.
Якщо ви засолюєте та хешируете свої паролі, і кожна сіль відрізняється, потенційний хакер повинен створити таблицю веселки для кожного варіанту солі , просто щоб мати таблицю веселки для одного засоленого + хешованого пароля. Це означає, що якщо у вас є 1 мільйон користувачів, хакер повинен генерувати 1 мільйон райдужних таблиць. Якщо ви використовуєте однакову сіль для кожного користувача, хакер повинен створити лише одну таблицю веселки, щоб успішно зламати вашу систему.
Якщо ви не засолюєте свої паролі, то зловмисник повинен лише підняти існуючу таблицю Rainbow для кожної реалізації там (AES, SHA-512, MD5) і просто подивитися, чи відповідає один хеш. Це вже зроблено , зловмиснику не потрібно обчислювати ці таблиці Веселки .
Навіть при всьому цьому ви повинні використовувати хороші методи безпеки . Якщо вони можуть успішно використовувати інший вектор атаки (XSS, SQL Injection, CSRF та ін. ) На вашому сайті, хороша безпека паролів не має значення. Це звучить як суперечливе твердження, але подумайте: якщо я можу отримати всю вашу інформацію про користувача через атаку ін'єкції SQL, або я можу змусити ваших користувачів передавати мені файли cookie через XSS, то не важливо, наскільки хороший ваш пароль безпека є .
Інші ресурси:
- Jeff Atwood: спрощене шифрування .NET (чудово підходить для огляду хешування)
- Джефф Етвуд: Я щойно увійшов як ти
- Джефф Етвуд: Ви, ймовірно, зберігаєте паролі неправильно
- Джефф Етвуд: Швидкість хешування
Примітка. Будь ласка, рекомендуйте інші хороші ресурси. Я, мабуть, прочитав десяток статей десятків авторів, але мало хто пише так просто, як Джефф. Будь ласка, редагуйте в статтях, як ви їх знайдете.