2019-07-16 14:29:10 4400瀏覽
本篇文章扣丁學(xué)堂PHP培訓(xùn)小編給小伙伴們介紹一下關(guān)于PHP中常見的密碼處理方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,感興趣的小伙伴就隨小編一起來了解一下吧。
在使用PHP開發(fā)Web應(yīng)用的中,很多的應(yīng)用都會要求用戶注冊,而注冊的時候就需要我們對用戶的信息進行處理了,最常見的莫過于就是郵箱和密碼了,本文意在討論對密碼的處理:也就是對密碼的加密處理。
密碼安全的重要性我們就不用再去強調(diào),隨著在線攻擊的增多,如果我們對密碼沒有進行合適的處理或做防御措施,我們的應(yīng)用就會肯定會收到來自各方的威脅和攻擊。
關(guān)于密碼我們應(yīng)該遵守的一些原則
1、絕對不能知道用戶的密碼
我們絕對不能知道用戶的密碼,也不能有獲取用戶密碼的方式。
知道的越少(包括我們開發(fā)者自己)越安全。
2、絕對不去約束用戶的密碼
最好不要去約束密碼的長度、格式等。
如果要求密碼符合一個特定的模式,其實對于那些不懷好意的人也提供了攻擊的途徑。
如果必須要約束的話,建議只限制最小長度。并把常用的密碼或基于字典創(chuàng)建的密碼加入黑名單,也是一個好主意。
3、絕對不通過電子郵件發(fā)送用戶的密碼
對于一個web應(yīng)用來說,重置或修改密碼時,我們應(yīng)該在郵件里發(fā)送用于設(shè)定或修改密碼的 URL 。而且這個URL中應(yīng)該會包含一個唯一的令牌,這個令牌只能在設(shè)定或修改密碼時使用一次。在設(shè)定或修改密碼之后,我們就應(yīng)該把這個令牌置為失效。
使用bcrypt計算用戶密碼的哈希值
目前,通過大量的審查,最安全的哈希算法是 bcrypt 。
首先,我們明確兩個概念,哈希、加密。哈希和加密有什么區(qū)別?
加密
加密是雙向算法,加密的數(shù)據(jù)之后通過解密還可以得到。
哈希
哈希是單向算法,哈希后的數(shù)據(jù)不能再還原成原始值。
哈希算法的用途,
驗證數(shù)據(jù)的完整性(要求算法速度快)
用戶提高密碼等需要單向驗證的數(shù)據(jù)的安全性(要求安全性高,甚至故意要求時間慢)
一般我們在數(shù)據(jù)庫中保存的應(yīng)該是計算出來的密碼的哈希值。這樣即使我們的數(shù)據(jù)庫泄露了,他們也只能看到這些無意義的密碼的哈希值。
哈希的算法有很多種。
MD5
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現(xiàn)。將數(shù)據(jù)(如漢字)運算為另一固定長度值,是雜湊算法的基礎(chǔ)原理,MD5的前身有MD2、MD3和MD4。
SHA1
安全哈希算法(Secure Hash Algorithm)主要適用于數(shù)字簽名標(biāo)準(zhǔn) (Digital Signature Standard DSS)里面定義的數(shù)字簽名算法(Digital Signature Algorithm DSA)。對于長度小于2^64位的消息,SHA1會產(chǎn)生一個160位的消息摘要。當(dāng)接收到消息的時候,這個消息摘要可以用來驗證數(shù)據(jù)的完整性。在傳輸?shù)倪^程中,數(shù)據(jù)很可能會發(fā)生變化,那么這時候就會產(chǎn)生不同的消息摘要。 SHA1有如下特性:不可以從消息摘要中復(fù)原信息;兩個不同的消息不會產(chǎn)生同樣的消息摘要,(但會有1x10 ^ 48分之一的機率出現(xiàn)相同的消息摘要,一般使用時忽略)。
bcrypt
bcrypt是專門為密碼存儲而設(shè)計的算法,基于Blowfish加密算法變形而來,由Niels Provos和David Mazières發(fā)表于1999年的USENIX?!crypt最大的好處是有一個參數(shù)(work factor),可用于調(diào)整計算強度,而且work factor是包括在輸出的摘要中的。隨著攻擊者計算能力的提高,使用者可以逐步增大work factor,而且不會影響已有用戶的登陸?!crypt經(jīng)過了很多安全專家的仔細分析,使用在以安全著稱的OpenBSD中,一般認為它比PBKDF2更能承受隨著計算能力加強而帶來的風(fēng)險。bcrypt也有廣泛的函數(shù)庫支持,因此我們建議使用這種方式存儲密碼。
scrypt
scrypt不僅計算所需時間長,而且占用的內(nèi)存也多,使得并行計算多個摘要異常困難,因此利用rainbow table進行暴力攻擊更加困難。scrypt沒有在生產(chǎn)環(huán)境中大規(guī)模應(yīng)用,并且缺乏仔細的審察和廣泛的函數(shù)庫支持 。但是,scrypt在算法層面只要沒有破綻,它的安全性應(yīng)該高于PBKDF2和bcrypt。
目前,通過大量的審查,最安全的哈希算法是 bcrypt 。與 MD5 和 SHA1 不同, bcrypt 算法會自動加鹽,來防止?jié)撛诘牟屎绫砉簟?bcrypt 算法會花費大量的時間反復(fù)處理數(shù)據(jù),來生成安全的哈希值。在這個過程中,處理數(shù)據(jù)的次數(shù)叫工作因子(work factor)。工作因子的值越高,破解密碼哈希值的時間會成指數(shù)倍增長。
bcrypt 算法永不過時,如果計算機的運算速度變快了,我們只需要提高工作因子即可。
順帶說一下,任何情況下盡可能的不要使用 md5 算法,至少也要使用 SHA 系列的哈希算法。因為md5算法以目前計算機的計算能力來說顯得比較簡單,而 md5 的性能優(yōu)勢現(xiàn)在也已經(jīng)完全可以忽略不計了。
密碼哈希API
上面我們說到 bcrypt 算法最安全,最適合對我們的密碼進行哈希。 PHP 在 PHP5.5.0+ 的版本中提供了原生的密碼哈希API供我們使用,這個密碼哈希API默認使用的就是 bcrypt 哈希算法,從而大大簡化了我們計算密碼哈希值和驗證密碼的操作。
PHP原生密碼哈希API
密碼哈希函數(shù):
password_get_info
返回指定的哈希值的相關(guān)信息
password_hash
創(chuàng)建密碼的哈希(hash)
password_needs_rehash
檢查給定的哈希是否與給定的選項匹配
password_verify
驗證密碼是否和哈希匹配
想要了解更多關(guān)于PHP開發(fā)方面內(nèi)容的小伙伴,請關(guān)注扣丁學(xué)堂PHP培訓(xùn)官網(wǎng)、微信等平臺,扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育有專業(yè)的PHP講師為您指導(dǎo),此外扣丁學(xué)堂老師精心推出的PHP視頻教程定能讓你快速掌握PHP從入門到精通開發(fā)實戰(zhàn)技能??鄱W(xué)堂PHP技術(shù)交流群:374332265。
【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】 【掃碼進入Python全棧開發(fā)免費公開課】
查看更多關(guān)于“php培訓(xùn)資訊”的相關(guān)文章>>