Quindi, vuoi usare bcrypt? Eccezionale!Tuttavia, come altre aree della crittografia, non dovresti farlo da solo. Se devi preoccuparti di qualcosa come la gestione delle chiavi, la memorizzazione di sali o la generazione di numeri casuali, stai sbagliando.
Il motivo è semplice: è così banalmente facile rovinare bcrypt . In effetti, se guardi quasi ogni parte di codice in questa pagina, noterai che sta violando almeno uno di questi problemi comuni.
Ammettilo, la crittografia è difficile.
Lascialo per gli esperti. Lascialo per le persone il cui compito è mantenere queste librerie. Se devi prendere una decisione, la stai sbagliando.
Invece, basta usare una libreria. Ne esistono diversi a seconda delle tue esigenze.
biblioteche
Ecco una ripartizione di alcune delle API più comuni.
API PHP 5.5 - (disponibile per 5.3.7+)
A partire da PHP 5.5, viene introdotta una nuova API per le password di hashing. C'è anche una libreria di compatibilità shim mantenuta (da me) per 5.3.7+. Questo ha il vantaggio di essere un'implementazione peer-reviewed e semplice da usare.
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
}
}
Davvero, mira ad essere estremamente semplice.
risorse:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
Questa è un'altra API simile a quella di PHP 5.5 e ha uno scopo simile.
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
}
}
risorse:
PasswordLib
Questo è un approccio leggermente diverso all'hash delle password. Anziché supportare semplicemente bcrypt, PasswordLib supporta un gran numero di algoritmi di hashing. È utile soprattutto in contesti in cui è necessario supportare la compatibilità con sistemi legacy e disparati che potrebbero essere al di fuori del proprio controllo. Supporta un gran numero di algoritmi di hashing. Ed è supportato 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
}
}
Riferimenti:
- Codice sorgente / Documentazione: GitHub
PHPASS
Questo è un livello che supporta bcrypt, ma supporta anche un algoritmo abbastanza potente utile se non si ha accesso a PHP> = 5.3.2 ... In realtà supporta PHP 3.0+ (anche se non con 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
}
}
risorse
Nota: non utilizzare le alternative PHPASS che non sono ospitate su openwall, sono progetti diversi !!!
Informazioni su BCrypt
Se noti, ognuna di queste librerie restituisce una singola stringa. Ciò è dovuto al modo in cui BCrypt funziona internamente. E ci sono un sacco di risposte a riguardo. Ecco una selezione che ho scritto, che non copierò / incollerò qui, ma rimanderò a:
Incartare
Ci sono molte scelte diverse. Quale scegli dipende da te. Tuttavia, vorrei ALTAMENTE consiglia di utilizzare una delle librerie di cui sopra per la gestione di questo per voi.
Ancora una volta, se stai usando crypt()
direttamente, probabilmente stai facendo qualcosa di sbagliato. Se il tuo codice utilizza hash()
(o md5()
o sha1()
) direttamente, stai quasi sicuramente facendo qualcosa di sbagliato.
Usa una libreria ...