Итак, вы хотите использовать bcrypt? Потрясающие! Однако, как и в других областях криптографии, вы не должны делать это самостоятельно. Если вам нужно беспокоиться о чем-то вроде управления ключами, хранения солей или генерации случайных чисел, вы делаете это неправильно.
Причина проста: так просто обкатать 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
}
}
Ресурсы
Примечание: не используйте альтернативы PHPASS, которые не размещены на openwall, это разные проекты !!!
О компании BCrypt
Если вы заметили, каждая из этих библиотек возвращает одну строку. Это из-за того, как BCrypt работает внутри. И есть тонна ответов об этом. Вот подборка, которую я написал, которую я не буду здесь копировать / вставлять, но буду ссылаться на:
Заворачивать
Есть много разных вариантов. Что вы выбираете, зависит от вас. Тем не менее, я НАСТОЯТЕЛЬНО рекомендую вам использовать одну из перечисленных выше библиотек для решения этой проблемы.
Опять же, если вы используете crypt()
напрямую, вы, вероятно, делаете что-то не так. Если ваш код использует hash()
(или md5()
или sha1()
) напрямую, вы почти наверняка делаете что-то не так.
Просто используйте библиотеку ...