Benim veritabanında şifreleri saklamak ve doğrulamak için bir yol olarak PHP'nin crypt()
kullanarak oldum. Ben şifreler için başka şeyler için hashing kullanan, ancak crypt()
. Dokümantasyon iyi değil ve bir çok tartışma gibi görünüyor. Ben bir parola crypt ve veritabanında depolamak için blowfish ve iki tuzları kullanıyorum. Tuz şifreli parola dizesi bir parçası çünkü tuz ve (tuzlu bir karma gibi) şifreli parolayı depolamak ancak gereksiz fark olacak önce.
Ben gökkuşağı tablo saldırılar crypt()
, yine de bu güvenlik açısından doğru gözüküyor üzerinde çalışmak nasıl biraz kafam karıştı. Ben muhtemelen overkill, kısa şifreleri entropi artırmak için şifre eklemek için ikinci bir tuz kullanabilirsiniz ama neden olmasın?
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 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
$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;
}