PHP 於昨天發布並帶來了一份完整的全新特性與函數的列表全新API之一就是Password Hashing API它包含個函數password_get_info() password_hash()password_needs_rehash()和password_verify()讓我們分步來了解每個函數
我們首先討論password_hash()函數這將用作創建一個新的密碼的哈希值它包含三個參數密碼哈希算法選項前兩項為必須的你可以根據下面的例子來使用這個函數
$password = ;foo;;
$hash = password_hash($passwordPASSWORD_BCRYPT);
//$y$$uOegXJqznQsKvPfxruWjpJBxVDHKGJQVnodzjnglhsWTwHu
你將注意到我們並沒有給這個哈希加任何選項現在可用的選項被限定為兩個 cost 和salt妖添加選項你需要創建一個關聯數組
$options = [ ;cost; =>
;salt; => mcrypt_create_iv( MCRYPT_DEV_URANDOM) ];
將選項添加到 password_hash() 函數後我們的哈希值變了這樣更加安全
$hash = password_hash($passwordPASSWORD_BCRYPT$options);
//$y$$JDJJDEwJDhsTHVSGVIQuprRHZnGQsUEtlkIemokHHPyCoo
現在哈希創建完畢了我們可以通過 password_get_info() 查看新建哈希值得相關信息 password_get_info() 需要一個參數——哈希值——並返回一個包含算法(所用哈希算法的整數代表形式)算法名(所用哈希算法的可讀名稱)以及選項(我們用於創建哈希值得選項)的關聯數組
var_dump(password_get_info($hash));
/*
array() {
["algo"]=>
int()
["algoName"]=>
string() "bcrypt"
["options"]=>
array() {
["cost"]=>
int()
}
}
*/
先一個被添加到 Password Hashing API 的是 password_needs_rehash()它接受三個參數hashhash 算法以及選項前兩個是必填項 password_needs_rehash()用來檢查一個hash值是否是使用特定算法及選項創建的這在你的數據庫受損需要調整hash時非常有用通過利用 password_needs_rehash() 檢查每個hash值我們可以看到已存的hash 值是否匹配新的參數 僅影響那些使用舊參數創建的值
最後我們已經創建了我們的hash值查閱了它如何被創建查閱了它是否需要被重新hash現在我們需要驗證它要驗證純文本到其hash值我們必須使用 password_verify()它需要兩個參數密碼及hash值並將返回 TRUE 或 FALSE讓我們檢查一次我們獲得的 hashed 看看是否正確
$authenticate = password_verify(;foo;;$y$$JDJJDEwJDhsTHVSGVIQuprRHZnGQsUEtlkIemokHHPyCoo;);
//TRUE
$authenticate = password_verify(;bar;;$y$$JDJJDEwJDhsTHVSGVIQuprRHZnGQsUEtlkIemokHHPyCoo;);
//FALSE
通過以上知識你可以在新的 PHP 版本中迅速且安全的創建 hash 密碼了
From:http://tw.wingwit.com/Article/program/PHP/201404/30631.html