php對用戶密碼進(jìn)行加密技巧實(shí)例
摘要
密碼驗(yàn)證是很常見的需求,如何在實(shí)現(xiàn)功能之余,防止用戶密碼泄露,已經(jīng)有了很成熟的方案。這篇文章把自己的思考和結(jié)論做一下記錄。
對用戶密碼進(jìn)行加密時(shí)需要做到:
防止用戶密碼明文被竊聽
1.交給https,明文傳輸。
2.客戶端將密碼加鹽(鹽隨機(jī)生成、具有強(qiáng)度)并哈希。服務(wù)端再次加鹽哈希并對比。假設(shè)https被竊聽,攻擊者破解密碼明文也具有相當(dāng)難度。
防止數(shù)據(jù)庫被攻破時(shí),用戶密碼明文被竊取。
1.增加哈希算法強(qiáng)度。
2.隨機(jī)生成具有強(qiáng)度的鹽。
一些思考
哈希算法是不可逆的。攻擊者可以生成海量的密碼 -> 哈希值鍵值對,反向映射,有概率通過哈希值得到密碼。
故,破解的成本=哈希算法強(qiáng)度×鹽值數(shù)量。
如何選擇哈希算法強(qiáng)度
- 計(jì)算耗時(shí)用戶可接受(視應(yīng)用場景,如0.2S內(nèi))。
- 計(jì)算耗時(shí)盡量長,即增加哈希算法強(qiáng)度。
為什么鹽要隨機(jī)
如果鹽不隨機(jī),攻擊者可以針對單個鹽生成哈希值->密碼鍵值對,再對整個數(shù)據(jù)庫的哈希值做匹配。
假設(shè)鹽是保密的,鹽可能因?yàn)楦鞣N原因被攻擊者獲?。ùa泄漏、社會工程學(xué)等等)。
攻擊者也可以通過在數(shù)據(jù)庫被攻破的網(wǎng)站上注冊用戶,通過 哈希值->攻擊者密碼+鹽 來破解鹽。
為什么鹽要有強(qiáng)度
如果鹽的強(qiáng)度(長度)不夠。攻擊者可以建立多個 哈希值->密碼 數(shù)據(jù)庫,簡單鹽被匹配(攻破)的概率更高。
為什么鹽可以明文存儲
攻擊者很難有足夠的計(jì)算資源和存儲空間建立海量的 哈希值->密碼 數(shù)據(jù)庫,針對單條用戶記錄,建立 哈希值->密碼 數(shù)據(jù)庫進(jìn)行攻擊的成本過高。
php的實(shí)現(xiàn)
最初的想法
需求是房間密碼,出于簡單考慮,我最初的想法是,MD5+隨機(jī)鹽。
在數(shù)據(jù)庫里大致是這樣:
+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | uid | int(11) | NO | PRI | NULL | | | pwd | varchar(45) | YES | | NULL | | | salt | varchar(45) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
php的推薦實(shí)現(xiàn)
php的md5文檔
http://php.net/manual/zh/func...
給了一個很好的指引:
http://php.net/manual/zh/faq....
password_hash 和 crypt 函數(shù)返回值的組成部分,依次為:所選擇的算法,算法選項(xiàng),所使用的“鹽”,以及散列后的密碼。
更改后、數(shù)據(jù)庫表變?yōu)椋?/p>
+-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | uid | int(11) | NO | PRI | NULL | | | pwd | varchar(255) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
相較之前的方案:
1.記錄了采用的算法(可以在不改動代碼的情況下升級算法)
2.記錄了采用算法的cost(強(qiáng)度),可以在硬件計(jì)算能力上升的情況下,調(diào)整cost來維持安全性。
3.鹽和哈希值一并返回,簡化了接口調(diào)用、數(shù)據(jù)庫存儲。
php的驗(yàn)證接口設(shè)計(jì)得相當(dāng)漂亮。
使用簡單,強(qiáng)制調(diào)用者使用隨機(jī)的salt(不容易誤用),可在不修改代碼的情況下拓展算法強(qiáng)度。
代碼:
if (!empty($xxxx_info['pwd'])) { // 若原來有密碼,則要檢測 if (!password_verify($old_pwd, $xxxx_info['pwd'])) { // 用戶名或密碼錯 return; } } // 對密碼長度、內(nèi)容等不做限制。 // 以應(yīng)用場景來說,123456之類也無所謂。 $pwd_in_db = password_hash($new_pwd, PASSWORD_DEFAULT, array("cost" => 6));
參考
https://www.php.net/manual/zh/faq.passwords.php#faq.passwords.fasthash
http://www.dbjr.com.cn/article/116492.htm
以上就是php對用戶密碼進(jìn)行加密技巧實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于php用戶密碼加密的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php使HTML標(biāo)簽自動補(bǔ)全閉合函數(shù)代碼
這個網(wǎng)上找到的自動補(bǔ)全閉合函數(shù)還挺不錯的,它可以根據(jù)你的html內(nèi)容自己補(bǔ)全閉合,確保HTMl代碼正確2012-10-10PHP實(shí)現(xiàn)把MySQL數(shù)據(jù)庫導(dǎo)出為.sql文件實(shí)例(仿PHPMyadmin導(dǎo)出功能)
這篇文章主要介紹了PHP實(shí)現(xiàn)把MySQL數(shù)據(jù)庫導(dǎo)出為.sql文件實(shí)例(仿PHPMyadmin導(dǎo)出功能),需要的朋友可以參考下2014-05-05PHP實(shí)現(xiàn)電商訂單自動確認(rèn)收貨redis隊(duì)列
下面小編就為大家?guī)硪黄狿HP實(shí)現(xiàn)電商訂單自動確認(rèn)收貨redis隊(duì)列。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05PHP實(shí)現(xiàn)阿里大魚短信驗(yàn)證的實(shí)例代碼
本篇文章主要介紹了PHP實(shí)現(xiàn)阿里大魚短信驗(yàn)證的實(shí)例代碼的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07