BCrypt in Swift
Swift
Bcrypt
Cryptography
今天要介紹的是 Bcrypt, 一種 HASH 演算法,為啥需要這個演算法,讓我們細細道來
我們都知道 Server side 不應該使用明碼儲存使用者的密碼
可是,就算是使用加密,Server side 還是保有解出密碼的解密 Key - 就會有人的風險
所以,最佳情境是使用保存密碼的 HASH 值
可是,保存密碼的 HASH 值還是有可能會被彩虹表(Rainbow table) 查找出來
所以,最佳情境是保存時加上 Salt,增加被對比出來的難度
可是,如果加的 Salt 是固定的,還是可以快速建立彩虹表來查找
可是,如果加的 Salt 是隨機的,那就產生另外一個問題,下次使用者使用密碼登入的時候,你要怎樣知道密碼是對的
登登~
Bcrypt
詳細內容就請收看 Wiki(in 上方連結)
簡單說他就是一個可以解決我們上述的問題的演算法
使用隨機的 Salt,可以調整 Hash 的次數,讓相同的輸入每次都得到不同的結果
並且將 Salt 保存在最終的結果裡面
所以還是可以驗證 明文跟密文 是不是對應的
上個圖, 來源: https://stackoverflow.com/questions/27592732/what-should-be-stored-in-table-while-using-bcrypt
下一個問題是,如果 Database 被搬走了,或者是 該密碼的 Hash 結果被洩露了
要怎樣增加密碼被解出來的難度(也只剩下增加時間難度了)
簡單說明,明文長度越長,會讓反解的時間加倍
將明文先做 HMAC 再做 BCrypt 安全性就增加更多了
Perfect-BCrypt
使用起來很簡單,基本上你只會需要使用三個 Function
import PerfectBCrypt
// rounds 就是你要HASH的次數 , 4 ~ 31 太大太小都會報錯
let salt = try BCrypt.Salt(._2A, rounds: round)
// 取得 Hash 值
let hashed = try BCrypt.Hash(password, salt: salt)
// 檢查密碼是否跟密文相同
let isSame = BCrypt.Check(password, hashed: hashed)
打完收工