Il modo più semplice per proteggere lo schema di archiviazione delle password è utilizzare una libreria standard .
Poiché la sicurezza tende ad essere molto più complicata e con più possibilità invisibili di problemi che la maggior parte dei programmatori potrebbe affrontare da sola, l'utilizzo di una libreria standard è quasi sempre l'opzione più semplice e sicura (se non l'unica) disponibile.
La nuova API password PHP (5.5.0+)
Se stai utilizzando PHP versione 5.5.0 o successiva, puoi utilizzare la nuova API di hashing password semplificata
Esempio di codice usando l'API della password di PHP:
<?php
// $hash is what you would store in your database
$hash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);
// $hash would be the $hash (above) stored in your database for this user
$checked = password_verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
(Nel caso in cui si stia ancora utilizzando legacy 5.3.7 o versioni successive, è possibile installare ircmaxell / password_compat per avere accesso alle funzioni integrate)
Miglioramento su hash salati: aggiungi pepe
Se desideri maggiore sicurezza, i responsabili della sicurezza ora (2017) consigliano di aggiungere un ' pepe ' agli hash delle password (automaticamente) salati.
Esiste un semplice drop in class che implementa in modo sicuro questo modello, che consiglio:
Netsilik / PepperedPasswords
( github ).
Viene fornito con una licenza MIT, quindi puoi usarlo come vuoi, anche in progetti proprietari.
Esempio di codice usando Netsilik/PepperedPasswords
:
<?php
use Netsilik/Lib/PepperedPasswords;
// Some long, random, binary string, encoded as hexadecimal; stored in your configuration (NOT in your Database, as that would defeat the entire purpose of the pepper).
$config['pepper'] = hex2bin('012345679ABCDEF012345679ABCDEF012345679ABCDEF012345679ABCDEF');
$hasher = new PepperedPasswords($config['pepper']);
// $hash is what you would store in your database
$hash = $hasher->hash($_POST['password']);
// $hash would be the $hash (above) stored in your database for this user
$checked = $hasher->verify($_POST['password'], $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
La libreria standard OLD
Nota: non dovresti più averne bisogno! Questo è solo qui per scopi storici.
Dai un'occhiata a: Framework di hashing della password PHP portatile : phpass e assicurati di utilizzare l' CRYPT_BLOWFISH
algoritmo, se possibile.
Esempio di codice usando phpass (v0.2):
<?php
require('PasswordHash.php');
$pwdHasher = new PasswordHash(8, FALSE);
// $hash is what you would store in your database
$hash = $pwdHasher->HashPassword( $password );
// $hash would be the $hash (above) stored in your database for this user
$checked = $pwdHasher->CheckPassword($password, $hash);
if ($checked) {
echo 'password correct';
} else {
echo 'wrong credentials';
}
PHPass è stato implementato in alcuni progetti abbastanza noti:
- phpBB3
- WordPress 2.5+ e bbPress
- la versione Drupal 7, (modulo disponibile per Drupal 5 e 6)
- altri
La cosa buona è che non devi preoccuparti dei dettagli, quei dettagli sono stati programmati da persone con esperienza e recensiti da molte persone su Internet.
Per ulteriori informazioni sugli schemi di memorizzazione delle password, leggi il post sul blog di Jeff : Probabilmente stai memorizzando le password in modo errato
Qualunque cosa tu faccia se scegli l'approccio " Lo farò io, grazie ", non usarlo MD5
o SHA1
più . Sono un bel algoritmo di hashing, ma considerato rotto per motivi di sicurezza .
Attualmente, usando crypt , con CRYPT_BLOWFISH è la migliore pratica.
CRYPT_BLOWFISH in PHP è un'implementazione dell'hash Bcrypt. Bcrypt si basa sul codice a blocchi Blowfish, facendo uso della sua costosa configurazione dei tasti per rallentare l'algoritmo.