現在項目,用戶注冊登錄部分很少有涉及到了,原因:現在熱門開發框架都已經在底層幫我們做了一套用戶注冊,密碼加密,登錄認證,權限控制,緩存數據等基本功能。
這有利於項目的快速完成,只需要搬磚碼畜們專注於業務邏輯,會利用底層的業務邏輯就行了。這些快速開發框架的出現,也降低了我們java行業的就業門檻,但這不利於我們個人的成長(個人競爭力的體現不能只是會寫業務邏輯代碼,需要的是擁有絕對的技術壁壘,你有我優,你無我有!)
實際過程中使用過md5和sha1消息摘要算法,也看別人用過spring security的BCryptPasswordEncoder
sha1算法介紹及代碼:java學習-sha1散列算法
bit:比特或位
byte:字節
sha1消息摘要后得到的是byte[] bytes=new byte[20] ,即20字節長度,160位(20byte * 8=160)二進制長度,
40(20byte * 2=40,一個byte轉為一個的十六進制)個十六進制字符串長度的數據
MD5算法介紹及代碼:java學習-MD5消息摘要算法
MD5得到的是 128位,16字節長度, 32個十六進制字符串長度的數據。
BCryptPasswordEncoder
這個spring security的密碼加密算法,對相同密碼加密每次得到的加密字符串都是不一樣的。
這個框架自定義hash加密方法。
源碼好復雜:
1.生成指定長度的隨機salt字節數組
2.對salt和password進行base64解碼、字節數組截取等操作后將salt和password執行spring security自定義的加密算法。
3.將加密后的hash數據和其他數據進行一定的組合得到加密后的字符串
存在問題:
md5 和 sha1 兩種散列算法,無論執行多少次,對同一個密碼進行加密后的字符換都是一樣的,這雖然加密的密碼是不可逆的,但可以通過密碼字典進行查找比對獲得用戶真正的密碼。
如果是簡單的密碼,如123456 或 admin 這些很容易被人破解。
現在框架底層加密密碼都是在 MD5 和 SHA-1 這兩種算法的基礎上進行改造。跟spring security的密碼加密算法原理類似。
先隨機生成一個salt,然后和用戶的密碼一起使用 md5 或者sha1 進行哈希獲得加密字符串。
然后在將salt和加密后的字符換拼接組成加密密碼字符串存儲到數據庫中。
這種改進方法有很多變化性,比如這個salt字符串的長度不確定性,可以由開發人員隨意指定。還有這個 md5 或 sha1 哈希這個密碼的次數。這個也可以由開發 指定。
這可以更有效的防止用戶的密碼被暴力破解。
最新總結的密碼加密源碼地址(不需要依賴第三方jar包)