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