md5自不必說,想必所有phper都用過,但另一個加密函數不知道你見過沒有
他就是password_hash();
加密方式更全面.使用起來也比md5+salt這種方式要簡潔很多,最主要的是難破解,因為它每時每刻都在變動
它的使用方式大致是這樣
1. 用戶注冊時提交過來密碼,我們對用戶密碼進行加密,這里選擇password_hash進行加密
2. 加密之后,將加密好的密碼存儲到數據表中
3.用戶再次登錄時,我們從表中取出密碼,并使用password_verify函數進行校驗,查看兩種密碼是否相同
簡單的使用:
//用戶注冊時提交的密碼
$pass_user_commit = '123456';
//對用戶提交的密碼進行password_hash加密,并存儲到數據庫
$pass = password_hash($pass_user_commit,PASSWORD_BCRYPT);
//echo $pass;
//第一次輸出生成的密碼: $2y$10$Y/rlaKniAaj9y70zJgMfsespKfHNZjM5FyjRRvgbGlKXyr.1yJIIG
//第二次輸出生成的密碼: $2y$10$vveX2r5nQr4mc2M.8vAdDeTShA0gMX.73uMd18V.Y.7E44qLloqgi
//由此可見,由password_hash函數生成的密碼是動態的,破解幾乎很難//用戶登錄時提交的密碼
$pass_user = '123456';
//將用戶登錄時提交的密碼與用戶注冊時提交的密碼進行對比
$re = password_verify($pass_user,$pass);
if ($re) {echo "密碼真確";
} else {echo "密碼錯誤";
}
如果兩次輸入的密碼不一樣,就會輸出密碼錯誤
總結:password_hash函數用來加密密碼無疑很好用,而且,他還有第三個可選參數,為密碼的加密再加一層保障,比如:
?
//用戶注冊時提交的密碼
$pass_user_commit = '123456';
//對用戶提交的密碼進行password_hash加密,并存儲到數據庫
$option = array('cost'=>10);//cost,用來指明算法遞歸的層數
$pass = password_hash($pass_user_commit,PASSWORD_BCRYPT,$option);
echo $pass;
//第一次輸出生成的密碼:$2y$10$s78CmhptXOj1oYygCAQPNed.lMFqPBAQpJJXek5nf01pMc46gMLCu
//第二次輸出生成的密碼:$2y$10$LoXFBGwuLbAs9CvZ/4usT.jLVgKpUnTBCDRODRJXsC3BkTi3Ci.bC
//由此可見,由password_hash函數生成的密碼是動態的,破解幾乎很難//用戶登錄時提交的密碼
$pass_user = '123456';
//將用戶登錄時提交的密碼與用戶注冊時提交的密碼進行對比
$re = password_verify($pass_user,$pass);
if ($re){echo "密碼正確";
}else{echo "密碼錯誤";
}
具體參數詳解:?php.net
但卻存在以下問題
1. 版本要求 ?php版本必須5.5+ (如果做接口對接,要求雙方php版本都在5.5以上,會不會有一些不太現實)
2. 通過password_hash加密的密碼基本只能通過php的函數password_verify來校驗(這樣和其他語言交互時會不會很麻煩呢)
所以呢,如果php自家用,我感覺password_hash真的是一個不錯的選擇,但如果和其他語言或者外界交互的話,可能就會出現一些小麻煩