BCrypt 加密演算法精闢解釋 - lustan3216/BlogArticle GitHub Wiki
BCrypt 只能單向加密! 不能反向解密!
那這樣登入時要怎麼知道帳號密碼是不是對的呢?
當你的密碼123456
加密之後的hash
變成xxxxxx
,下次登入時再輸入123456
,他就會再加密一次hash
與再資料庫的hash
比對相同則能登入。
假如輸入密碼是654321
這樣hash
會變成aaaaaxx
再與資料庫比對不相同就不能登入。
這樣叫做單向加密。
#BCrypt 加密計算很慢?
因應現在的電腦的 GPU、CPU 跑太快,那到底有多快呢?AMD的繪圖卡Radeon HD 5770
只要一秒鐘就能破解五個字元,夾帶數字與大小寫的密碼,夠驚人吧?連七位數的密碼讓GPU算都只要17分鐘多一點,再更頂級的一塊顯示卡每秒80億次的速度,這樣你可想而知你的密碼有多麽脆弱,如果你想要更快知道複雜密碼那就用更多更好的 GPU 就可以更快破解密碼。
這時BCrypt
就是為了解決加密運算的速度"太快",你可以自己定義參數你想要跑多慢,而那個參數叫做cost
,他是用 2 的次方計算,像Devise預設是11,這樣就是2的11次方的複雜度,這樣就可以大大提升加密的速度。
###以下這張表是Intel i3-2120 (Quad Core, 3.30GHz)
每個不同cost
加密時間。
Intel i3-2120 (Quad Core, 3.30GHz)
Work Time (Seconds)
4 0.0013326406478882
5 0.0024385929107666
6 0.0046159029006958
7 0.0089994072914124
8 0.018425142765045
9 0.035568559169769
10 0.070761203765869
11 0.14275025129318
12 0.28672399520874
13 0.56773639917374
14 1.1397068500519
15 2.2705371022224
16 4.5342264413834
17 9.0786491513252
18 18.10820235014
19 36.225910997391
20 72.565172195435
所以當加密的時間越長,電腦算的速度就越慢,你想要越安全cost
數字就越大,這樣駭客破解就要以5、10年計算相對花費的成本就越高,但為了考慮使用者體驗和server的資源消耗上,所以數字必須設定適當的數字。
#BCrypt 怎麼組成的?
$2a$(2 chars work cost)$(22 chars salt 隨機的鹽含符號)(31 chars hash 加密的hash含符號)
BCrypt加密方式就是配合
cost參數,再隨機的產生
salt對密碼加密,加密完成之後就會直接接在
salt的後面變成一組60字元的
Hash`。
假設password = 12345678 、 cost = 11
這樣會先隨機產生一組salt
= EvgzzV0AGkKwv3bEiYKx4O
然後再用salt
加密密碼12345678會變成
TDoUubTaZm/MgHzRq/.Th4H6M3lmMLW
最後在全部接在一起就會等於
$2a$11$EvgzzV0AGkKwv3bEiYKx4OTDoUubTaZm/MgHzRq/.Th4H6M3lmMLW