轉載地址:http://www.oschina.net/question/28_57478
最近爆出的網站安全問題越來越多,甚至有部分網站的密碼泄露,這是一篇簡單的教程,教你如何更加安全的保存密碼。我這裏說的“安全”是指當密碼泄露以後,對方需要相當一段時間來破解以獲得明文密碼。
下面我列出了常用的密碼存儲手段,從不安全到安全:
明文存儲
hash 存儲,例如 MD5,SHA,SHA256
hash 加鹽(salt)存儲
使用 bit/key stretching 機制
大家已經知道,即使是大型網站例如 Linked-In,存儲密碼也是簡單的 hash。我認爲這是一個嚴重的疏漏。我們有很多方法來加強密碼的存儲以防止暴力破解和 彩虹表。在這裏,我要大聲的說一遍,僅僅加鹽(salt)是不夠的!
首先讓我們來看看不同的技術出現的時間:
明文存儲:有史以來
hash 存儲:20世紀70年代早期
加鹽 hash:20世紀70年代晚期
bit/key stretching: bcrypt 2002, scrypt 2009, PBKDF2 2009
不同技術的耐破解程度
Technique / KDF | Year | Bruteforce | Dictionnary | RT | GPU | FPGA | ASIC | |
Hash | 1970 | No | No | No | No | No | No | |
Salted Hash | 1976 | No | No | Yes | No | No | No | |
PBKDF2 * | 2000 | Yes | Yes | Yes | Partial | No | No | |
Bcrypt | 2002 | Yes | Yes | Yes | Yes** | ?? | No | |
Scrypt * | 2009 | Yes | Yes | Yes | Yes** | Yes | Yes |
RT - Rainbow Table 彩虹表
在一年內破解一個密碼的開銷
Technique / KDF | 6 LL | 8 LL | 8 chars | 10 chars |
DES CRYPT | < 1$ | < 1$ | < 1$ | < 1$ |
MD5 | < 1$ | < 1$ | < 1$ | 1.1K$ |
MD5 CRYPT | < 1$ | < 1$ | 130$ | 1.1M$ |
PBKDF2 (100ms) | < 1$ | < 1$ | 18k$ | 160M$ |
bcrypt (95ms) | < 1$ | 4$ | 130K$ | 1.2B$ |
scrypt (64ms) | < 1$ | 150$ | 4.8M$ | 43B$ |
PBKDF2 (5.0s) | < 1$ | 29$ | 920K$ | 8.3B$ |
bcrypt (3.0s) | < 1$ | 130$ | 4.3M$ | 39B$ |
scrypt (3.8s) | 900$ | 610K$ | 19B$ | 175T$ |
解釋:
- "DES CRYPT" 和 "MD5 Crypt" 是加鹽的
- "LL" : 小寫字母,例如"aeterws"
- "chars" : 95 個可打印字符,例如"6,uh3y[a"
- 括號中的數字是算法設置所需要的時間,跟 CPU 和循環此處都有關係。