密碼模塊設計
流程圖
模塊
主要分拆成這幾個模塊來設計接口或者函數
加密解密
疑問1
關於加密用的那個隨機數
截圖1、接口調用,每次調用輸出都是不同的
截圖2、main函數運行,每次運行的輸出都是相同的
截圖2這種方式一起想不明白,網上查過,也看了點源碼,也沒得出確切的答案
我猜想是:main函數運行每次使用的種子都是相同的,而通過接口調用時種子更新了
源碼中的註解,看起來run main函數時JDK不認為是a call
疑問2
為什麽多次sha-1 hash哈希計算都要復位摘要
我猜想是:我們創建的MessageDigest實例,可以當作是一個加密工具,多次用相同的消息摘要對密碼加密的結果進行加密
加密
1、通過java.security.SecureRandom的nextBytes方法得到一個偽隨機salt
2、再通過org.apache.commons.codec.binary.Hex#encodeHexString把偽隨機salt進行Hex編碼,得到可視化字符串再保存
3、用這個偽隨機數salt經過多次 sha-1 hash,得到加密後的密碼再保存
a、 創建sha-1消息摘要對象:java.security.MessageDigest#getInstance("SHA-1")
b、 使用偽隨機數更新摘要:java.security.MessageDigest#update(salt)
c、 完成哈希計算,在調用完成後,摘要被重置:java.security.MessageDigest#digest(password.getBytes())
驗證密碼
1、 用之前保存的Hex編碼後的salt,通過org.apache.commons.codec.binary.Hex#decodeHex進行Hex解碼得到偽隨機salt
2、再用這個偽隨機數把要驗證的密碼字符串用相同的加密方法加密後,與保存的正確密碼進行比較
密碼模塊設計