Bcrypt加密之新認識

語言: CN / TW / HK

以前總認為Bcrypt加密更安全,但到底哪裏安全了。

首先來看看各算法對比

算法對比.jpg

必須明確一點:

Bcrypt是單向Hash加密算法,類似Pbkdf2算法 不可反向破解生成明文。

一、Bcrypt是怎麼加密的?

Bcrypt有四個變量:

  1. saltRounds: 正數,代表hash雜湊次數,數值越高越安全,默認10次。

  2. myPassword: 明文密碼字符串。

  3. salt: 鹽,一個128bits隨機字符串,22字符

  4. 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

鏈接:https://www.jianshu.com/p/2b131bfc2f10

來源:簡書

著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。