Uso il PHP crypt()
come metodo per archiviare e verificare le password nel mio database. Uso l'hashing per altre cose, ma crypt()
per le password. La documentazione non è buona e sembra che ci sia un sacco di dibattito. Sto usando blowfish e due sali per crittare una password e archiviarla nel database. Prima di memorizzare il sale e la password crittografata, (come un hash salato), ma ho realizzato la sua ridondante perché il sale fa parte della stringa di password crittografata.Sto usando correttamente la funzione crypt() di PHP?
Sono un po 'confuso su come gli attacchi di rainbow table funzionerebbero su crypt()
, comunque questo aspetto è corretto dal punto di vista della sicurezza. Uso un secondo sale per aggiungere la password per aumentare l'entropia delle password brevi, probabilmente eccessivo, ma perché no?
function crypt_password($password) {
if ($password) {
//find the longest valid salt allowed by server
$max_salt = CRYPT_SALT_LENGTH;
//blowfish hashing with a salt as follows: "$2a$", a two digit cost parameter, "$", and 22 base 64
$blowfish = '$2a$10$';
//get the longest salt, could set to 22 crypt ignores extra data
$salt = get_salt ($max_salt);
//get a second salt to strengthen password
$salt2 = get_salt (30); //set to whatever
//append salt2 data to the password, and crypt using salt, results in a 60 char output
$crypt_pass = crypt ($password . $salt2, $blowfish . $salt);
//insert crypt pass along with salt2 into database.
$sql = "insert into database....";
return true;
}
}
function get_salt($length) {
$options = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./';
$salt = '';
for($i = 0; $i <= $length; $i ++) {
$options = str_shuffle ($options);
$salt .= $options [rand (0, 63)];
}
return $salt;
}
function verify_password($input_password)
{
if($input_password)
{
//get stored crypt pass,and salt2 from the database
$stored_password = 'somethingfromdatabase';
$stored_salt2 = 'somethingelsefromdatabase';
//compare the crypt of input+stored_salt2 to the stored crypt password
if (crypt($input_password . $stored_salt2, $stored_password) == $stored_password) {
//authenticated
return true;
}
else return false;
}
else return false;
}
Utilizzare 'mt_rand' invece di' rand' sarebbe un piccolo miglioramento del tuo script – Sliq