Завжди використовуйте алгоритм хешування паролів: Argon 2 , Scrypt , Bcrypt або PBKDF2 .
Аргон2 виграв конкурс з шикування паролів 2015 року. Scrypt , Bcrypt і PBKDF2 старіші алгоритми, які вважаються менш привабливим в даний час, але до сих пір в основному звук, так що якщо ваша платформа не підтримує Argon- все ж, це нормально , щоб використовувати інший алгоритм зараз.
Ніколи не зберігайте пароль безпосередньо в базі даних. Не шифруйте це також: інакше, якщо ваш сайт буде порушений, зловмисник отримує ключ розшифровки і таким чином може отримати всі паролі. Паролі ОБОВ'ЯЗКОВО хешируются .
Хеш пароля має різні властивості з хеш - таблиці хеш або криптографічного хеш. Ніколи не використовуйте для пароля звичайний криптографічний хеш, такий як MD5, SHA-256 або SHA-512. Алгоритм хешування паролів використовує унікальну сіль (не використовується для будь-якого іншого користувача чи в базі інших даних). Сіль необхідна, щоб зловмисники не могли заздалегідь обчислити хеши загальних паролів: з сіллю вони повинні перезапустити обчислення для кожного облікового запису. Алгоритм хешування паролів по суті повільний - настільки повільний, як ви можете собі дозволити. Повільність шкодить зловмиснику набагато більше, ніж ви, тому що зловмиснику доводиться випробувати багато різних паролів. Щоб отримати додаткові відомості, див. Як надійно захистити паролі .
Хеш паролів кодує чотири відомості:
- Індикатор, який алгоритм використовується. Це необхідно для спритності : криптографічні рекомендації змінюються з часом. Потрібно мати можливість переходу до нового алгоритму.
- Індикатор складності або твердості Чим вище це значення, тим більше обчислень потрібно для обчислення хешу. Це має бути постійним або глобальним значенням конфігурації у функції зміни пароля, але воно повинно зростати з часом, оскільки комп'ютери стають швидшими, тому потрібно пам’ятати значення для кожного облікового запису. Деякі алгоритми мають одне числове значення, інші мають більше параметрів (наприклад, для налаштування використання процесора та використання оперативної пам’яті окремо).
- Сіль. Оскільки сіль повинна бути унікальною у всьому світі, її потрібно зберігати для кожного облікового запису. Сіль повинна генеруватися випадковим чином при кожній зміні пароля.
- Власний хеш, тобто вихід математичного обчислення в алгоритмі хешування.
Багато бібліотек містять парні функції, які зручно пакують цю інформацію у вигляді однієї рядка: та, яка приймає індикатор алгоритму, індикатор твердості та пароль, генерує випадкову сіль та повертає повну хеш-рядок; і той, який приймає пароль і повний хеш-рядок в якості вхідних даних і повертає булеве значення із зазначенням правильності пароля. Не існує універсального стандарту, але загальне кодування є
$ алгоритм $ параметри $ сіль $ вихід
де algorithm
число або коротка буквено-числова рядок, що кодує вибір алгоритму, parameters
є друкованою рядком salt
і output
кодуються в Base64 без закінчення =
.
16 байт вистачає на сіль і вихід. (Див., Наприклад, рекомендації щодо Argon2 .) Зашифровано в Base64, це 21 символ. Дві інші частини залежать від алгоритму та параметрів, але 20–40 символів є типовими. Це загалом близько 82 символів ASCII ( CHAR(82)
і Unicode немає необхідності), до яких слід додати запас безпеки, якщо ви думаєте, що згодом поле буде складно збільшити.
Якщо ви кодуєте хеш у двійковому форматі, ви можете зменшити його до 1 байта для алгоритму, 1–4 байта для твердості (якщо ви жорстко кодуєте деякі параметри), і 16 байт для солі та виводу , в цілому 37 байт. Скажіть, 40 байтів ( BINARY(40)
) мають принаймні пару запасних байтів. Зауважте, що це 8-бітні байти, а не символи для друку, зокрема поле може включати нульові байти.
Зауважте, що довжина хеша абсолютно не пов'язана з довжиною пароля.