Bcrypt加密之新認識
以前總認為Bcrypt加密更安全,但到底哪裏安全了。
首先來看看各算法對比
算法對比.jpg
必須明確一點:
Bcrypt是單向Hash加密算法,類似Pbkdf2算法 不可反向破解生成明文。
一、Bcrypt是怎麼加密的?
Bcrypt有四個變量:
-
saltRounds: 正數,代表hash雜湊次數,數值越高越安全,默認10次。
-
myPassword: 明文密碼字符串。
-
salt: 鹽,一個128bits隨機字符串,22字符
-
myHash: 經過明文密碼password和鹽salt進行hash,個人的理解是默認10次下 ,循環加鹽hash10次,得到myHash
每次明文字符串myPassword過來,就通過10次循環加鹽salt加密後得到myHash, 然後拼接BCrypt版本號+salt鹽+myHash等到最終的bcrypt密碼 ,存入數據庫中。
這樣同一個密碼,每次登錄都可以根據自省業務需要生成不同的myHash, myHash中包含了版本和salt,存入數據庫。
bcrypt密碼圖解:
bcrypt密碼組成.png
如Spring Security crypto 項目中實現的BCrypt方法加密: BCrypt.hashpw(myPassword, BCrypt.gensalt())
那即使黑客得到了bcrypt密碼,他也無法轉換明文,因為之前説了bcrypt是 單向hash算法
;
二、那如果黑客使用彩虹表進行hash碰撞呢?
有文章指出bcrypt一個密碼出來的時間比較長,需要0.3秒,而MD5只需要一微秒(百萬分之一秒),一個40秒可以窮舉得到明文的MD5,在bcrypt需要12年, 時間成本太高
,這我就沒仔細研究,詳細可看陳皓的
如何防範密碼被破解
三、那他是如何驗證密碼的?
在下次校驗時,從myHash中取出salt,salt跟password進行hash;得到的結果跟保存在DB中的hash進行比對。
如Spring Security crypto 項目中實現的BCrypt 密碼驗證 BCrypt.checkpw(candidatePassword, dbPassword)
作者:martin6699
鏈接:http://www.jianshu.com/p/2b131bfc2f10
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。