Więc chcesz użyć bcrypt? Niesamowite! Jednak, podobnie jak inne obszary kryptografii, nie powinieneś robić tego sam. Jeśli musisz się martwić o zarządzanie kluczami, przechowywanie soli lub generowanie liczb losowych, robisz to źle.
Powód jest prosty: tak banalnie łatwo jest zepsuć bcrypt . W rzeczywistości, jeśli spojrzysz na prawie każdy fragment kodu na tej stronie, zauważysz, że narusza on co najmniej jeden z tych typowych problemów.
Twarzą w twarz, kryptografia jest trudna.
Pozostaw to ekspertom. Pozostaw to osobom, których zadaniem jest utrzymanie tych bibliotek. Jeśli musisz podjąć decyzję, robisz to źle.
Zamiast tego po prostu użyj biblioteki. Istnieje kilka w zależności od wymagań.
Biblioteki
Oto podział niektórych z bardziej popularnych interfejsów API.
PHP 5.5 API - (dostępny dla 5.3.7+)
Począwszy od PHP 5.5, wprowadzany jest nowy interfejs API do mieszania haseł. Istnieje również biblioteka kompatybilności shim utrzymywana (przeze mnie) dla wersji 5.3.7+. Ma to tę zaletę, że jest recenzowaną i prostą w użyciu implementacją.
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
}
}
Naprawdę ma to być bardzo proste.
Zasoby:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
Jest to kolejny interfejs API podobny do PHP 5.5, który ma podobny cel.
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
}
}
Zasoby:
PasswordLib
Jest to nieco inne podejście do mieszania haseł. Zamiast obsługiwać bcrypt, PasswordLib obsługuje wiele algorytmów mieszających. Jest to szczególnie przydatne w kontekstach, w których należy wspierać zgodność ze starszymi i różnorodnymi systemami, które mogą być poza twoją kontrolą. Obsługuje dużą liczbę algorytmów mieszających. I jest obsługiwany 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
}
}
Bibliografia:
- Kod źródłowy / dokumentacja: GitHub
PHPASS
Jest to warstwa, która obsługuje bcrypt, ale obsługuje również dość silny algorytm, który jest użyteczny, jeśli nie masz dostępu do PHP> = 5.3.2 ... W rzeczywistości obsługuje PHP 3.0+ (choć nie z 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
}
}
Zasoby
Uwaga: Nie używaj alternatyw PHPASS, które nie są hostowane na openwall, są to różne projekty !!!
O BCrypt
Jeśli zauważysz, każda z tych bibliotek zwraca pojedynczy ciąg. To dlatego, że BCrypt działa wewnętrznie. I jest mnóstwo odpowiedzi na ten temat. Oto wybór, który napisałem, którego nie skopiuję / wkleję tutaj, ale link do:
Zakończyć
Istnieje wiele różnych opcji. To, co wybierzesz, zależy od ciebie. Chciałbym jednak WYSOCE zalecane jest użycie jednego z powyższych bibliotek do obsługi to za Ciebie.
Ponownie, jeśli używasz crypt()
bezpośrednio, prawdopodobnie robisz coś złego. Jeśli Twój kod używa bezpośrednio hash()
(lub md5()
lub sha1()
), prawie na pewno robisz coś złego.
Po prostu skorzystaj z biblioteki ...