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