我一直在使用PHP的crypt()
作爲存儲和驗證數據庫密碼的一種方式。我使用散列來處理其他事情,但使用crypt()
作爲密碼。文件不是很好,似乎有很多爭論。我使用河豚和兩種鹽來密碼並將其存儲在數據庫中。在我存儲salt和加密密碼之前(像鹽漬散列),但是實現了冗餘,因爲salt是加密密碼字符串的一部分。我正確使用PHP的crypt()函數嗎?
我對於如何在crypt()
上運行彩虹表攻擊感到有點困惑,無論如何,從安全的角度來看,這看起來是正確的。我使用第二個salt來追加密碼以增加短密碼的熵,可能是過度的,但爲什麼不呢?
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;
}
使用'mt_rand'而不是'rand'會對你的腳本有一點改進 – Sliq 2012-09-08 21:38:16