Отже, ви хочете використовувати 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 \ Пароль \ 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()
) безпосередньо, ви майже безумовно робите що - то неправильно.
Просто використовуйте бібліотеку ...