Найпростіший спосіб захистити схему зберігання паролів - це використовувати стандартну бібліотеку .
Оскільки безпека, як правило, набагато складніше і з більш невидимими можливостями накручування, ніж більшість програмістів може вирішити самостійно, використання стандартної бібліотеки майже завжди є найпростішим і найбезпечнішим (якщо не єдиним) доступним варіантом.
Новий API для пароля PHP (5.5.0+)
Якщо ви використовуєте PHP версії 5.5.0 або новішої, ви можете використовувати новий спрощений API хешування паролів
Приклад коду за допомогою API пароля PHP:
<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);
// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
(Якщо ви все ще використовуєте спадщину 5.3.7 або новішу версію, ви можете встановити ircmaxell / password_compat, щоб мати доступ до вбудованих функцій)
Поліпшення на солоних хешах: додайте перець
Якщо ви хочете отримати додатковий захист, люди із безпеки зараз (2017) рекомендують додати « перець » до (автоматично) солених хешей паролів.
Існує простий, класний, який надійно реалізує цю модель, я рекомендую:
Netsilik / PepperedPasswords
( github ).
Він постачається з ліцензією MIT, тому ви можете користуватися нею як завгодно, навіть у фірмових проектах.
Приклад коду з використанням Netsilik/PepperedPasswords
:
<?php
use Netsilik/Lib/PepperedPasswords;
// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');
$hasher = new PepperedPasswords($config['pepper']);
// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);
// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
Стандартна бібліотека OLD
Зверніть увагу: вам цього більше не потрібно! Це лише для історичних цілей.
Погляньте на: Портативний фреймворк хешування паролів PHP : phpass і переконайтеся, що ви використовуєте CRYPT_BLOWFISH
алгоритм, якщо це можливо.
Приклад коду за допомогою phpass (v0.2):
<?php
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
PHPass був реалізований у деяких досить відомих проектах:
- phpBB3
- WordPress 2.5+, а також bbPress
- випуск Drupal 7, (модуль доступний для Drupal 5 і 6)
- інші
Хороша річ у тому, що вам не потрібно турбуватися про деталі, ці деталі були запрограмовані людьми з досвідом та переглянуті багатьма людьми в Інтернеті.
Для отримання додаткової інформації про схеми зберігання паролів читайте в блозі Джеффа : Ви, ймовірно, зберігаєте паролі неправильно
Що б ви не робили, якщо ви йдете на підхід « Я зроблю це сам, дякую », не використовуйте MD5
або SHA1
більше . Вони є хорошим алгоритмом хешування, але вважаються порушеними з метою безпеки .
Наразі, використовуючи крипту , CRYPT_BLOWFISH - найкраща практика.
CRYPT_BLOWFISH у PHP - це реалізація хеша Bcrypt. Bcrypt базується на блоковому шифрі Blowfish, використовуючи дорогі налаштування ключів для уповільнення роботи алгоритму.