Самый простой способ обезопасить вашу схему хранения паролей - использовать стандартную библиотеку .
Поскольку безопасность, как правило, намного сложнее и с более невидимыми возможностями взломать, чем может решить большинство программистов в одиночку, использование стандартной библиотеки почти всегда является самым простым и наиболее безопасным (если не единственным) доступным вариантом.
Новый 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';
}
Старая стандартная библиотека
Обратите внимание: вам это больше не нужно! Это только для исторических целей.
Взгляните на: Переносимая среда хеширования паролей 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 и использует дорогостоящую настройку ключей для замедления алгоритма.