Итак, вы хотите использовать bcrypt? Удивительно! Однако, как и в других областях криптографии, вам не следует делать это самостоятельно.Если вам нужно беспокоиться о чем-либо, например, об управлении ключами, хранении солей или генерации случайных чисел, вы делаете это неправильно.
Причина проста: так просто просто *1005* испортить bcrypt .Фактически, если вы посмотрите почти на каждый фрагмент кода на этой странице, вы заметите, что он нарушает хотя бы одну из этих распространенных проблем.
Поверьте, криптография сложна.
Оставьте это для экспертов.Оставьте это людям, чья работа состоит в том, чтобы поддерживать эти библиотеки.Если вам нужно принять решение, вы делаете это неправильно.
Вместо этого просто используйте библиотеку.Некоторые из них существуют в зависимости от ваших требований.
Библиотеки
Ниже приведено описание некоторых наиболее распространенных API.
PHP 5.5 API - (доступно для версии 5.3.7+)
Начиная с PHP 5.5, вводится новый API для хеширования паролей.Также есть поддерживаемая мной библиотека совместимости shim для 5.3.7+.Преимущество такого подхода заключается в том, что он является рецензируемым и простым для использования в реализации.
function register($username, $password) {
$hash = password_hash($password, PASSWORD_BCRYPT);
save($username, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
if (password_verify($password, $hash)) {
//login
} else {
// failure
}
}
Действительно, он призван быть чрезвычайно простым.
Ресурсы:
Zend \ Crypt \ Password \ Bcrypt (5.3.2 +)
Это еще один API, похожий на PHP 5.5 и выполняющийаналогичная цель.
function register($username, $password) {
$bcrypt = new Zend\Crypt\Password\Bcrypt();
$hash = $bcrypt->create($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$bcrypt = new Zend\Crypt\Password\Bcrypt();
if ($bcrypt->verify($password, $hash)) {
//login
} else {
// failure
}
}
Ресурсы:
PasswordLib
Это немного другой подход к хешированию паролей.Вместо того, чтобы просто поддерживать bcrypt, PasswordLib поддерживает большое количество алгоритмов хеширования.Это в основном полезно в тех случаях, когда вам необходимо поддерживать совместимость с устаревшими и разрозненными системами, которые могут находиться вне вашего контроля.Поддерживает большое количество алгоритмов хеширования.И поддерживается 5.3.2 +
function register($username, $password) {
$lib = new PasswordLib\PasswordLib();
$hash = $lib->createPasswordHash($password, '$2y$', array('cost' => 12));
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$lib = new PasswordLib\PasswordLib();
if ($lib->verifyPasswordHash($password, $hash)) {
//login
} else {
// failure
}
}
Ссылки:
- Исходный код / документация: GitHub
PHPASS
Это слой, который поддерживает bcrypt, но также поддерживает довольно сильный алгоритм, который полезен, если у вас нет доступа к PHP> = 5.3.2 ... На самом деле он поддерживает PHP 3.0+ (хотя и не с bcrypt).
function register($username, $password) {
$phpass = new PasswordHash(12, false);
$hash = $phpass->HashPassword($password);
save($user, $hash);
}
function login($username, $password) {
$hash = loadHashByUsername($username);
$phpass = new PasswordHash(12, false);
if ($phpass->CheckPassword($password, $hash)) {
//login
} else {
// failure
}
}
Ресурсы
- Код: cvsweb
- Сайт проекта: на OpenWall
- Обзор алгоритма <5.3.0: <a href="https://stackoverflow.com/questions/16042128/is-this-a-good-hashing-password-function-in-php-if-not-why/16044003#16044003"> в StackOverflow
Примечание: Не используйте альтернативы PHPASS, которые не размещены наopenwall, это разные проекты !!!
О BCrypt
Если вы заметили, каждая из этих библиотек возвращает одну строку.Это из-за того, как BCrypt работает внутри.И есть тонна ответов об этом.Вот выборка, которую я написал, которую я не буду здесь копировать / вставлять, но буду ссылаться на:
Завершение
Есть много разных вариантов. Что вы выбираете, зависит от вас. Тем не менее, я бы HIGHLY рекомендовал использовать одну из перечисленных выше библиотек для обработки этого за вас.
Опять же, если вы используете crypt()
напрямую, вы, вероятно, делаете что-то не так. Если ваш код использует hash()
(или md5()
или sha1()
) напрямую, вы почти наверняка делаете что-то не так.
Просто используйте библиотеку ...