不久前,來自Dropbox的Devdatta Akhawe在官網(wǎng)博客上公開了Dropbox為保護(hù)用戶密碼安全所采取的措施。
存儲(chǔ)密碼明文是一件很拙劣的事情,相信不會(huì)有人這么做的。早在1976年,計(jì)算機(jī)行業(yè)就推行了單向散列機(jī)制,我們存儲(chǔ)的是密碼的散列值,而不是密碼本身。這種方式雖然杜絕了密碼被反向破解出明文,但卻阻止不了不懷好意的人對(duì)其進(jìn)行暴力破解。暴力破解雖然耗費(fèi)時(shí)間,但被“猜”出密碼是遲早的事。SHA散列算法速度很快,一個(gè)商用CPU每分鐘可以算出幾百萬個(gè)SHA256散列值,而有些GPU群集每秒鐘可以算出幾十億個(gè)。
加密和破解是一場(chǎng)你追我趕的長(zhǎng)期斗爭(zhēng)。Dropbox作為一個(gè)應(yīng)用范圍很廣的云存儲(chǔ)解決方案,他們又是如何保證用戶的密碼安全的呢?
Dropbox的加密機(jī)制構(gòu)建在三層加密基礎(chǔ)之上,從里到外就像洋蔥一樣層層疊加。他們先是使用SHA512散列算法對(duì)明文密碼進(jìn)行散列,然后針對(duì)散列值進(jìn)行bcrypt再散列。為什么在bcrypt之前要先做SHA散列呢?有些bcrypt實(shí)現(xiàn)會(huì)把散列值長(zhǎng)度截至72字節(jié),從而降低了密碼的熵值,而有的則允許變長(zhǎng)密碼,這樣容易受到DoS攻擊。使用SHA512散列可以得到固定長(zhǎng)度的512字節(jié)散列值,避免了上述的兩個(gè)問題。
在SHA散列之后是bcrypt散列。bcrypt散列算法是一種加鹽(salt)散列算法,每個(gè)密碼都有不同的“鹽”,并且是分開存儲(chǔ)的。bcrypt速度比較慢,這樣就很難通過硬件加速來加快破解速度。而且bcrypt散列使用了成本因子10(每個(gè)因子相當(dāng)于每一步計(jì)算需要耗費(fèi)100毫秒的時(shí)間),這樣就更是加大了暴力破解的難度。
經(jīng)過bcrypt散列之后,散列值會(huì)再次經(jīng)過AES256算法的加密,這次加密會(huì)使用到秘鑰,也就是所謂的“胡椒粉”(pepper)。胡椒粉也是被單獨(dú)存儲(chǔ)的,所以就算密碼被偷了,沒有這些胡椒粉,那些不懷好意的人也拿它們沒辦法。
經(jīng)過SHA512、bcrypt和AES256的三層加固,用戶就可以高枕無憂了。不過之前說過,加密和破解是一場(chǎng)永不停止的戰(zhàn)爭(zhēng),所以Dropbox在保護(hù)用戶密碼安全這項(xiàng)工作上永不停息。三層加固只是其中的一個(gè)環(huán)節(jié),他們還部署了應(yīng)對(duì)在線暴力破解的防護(hù)層。另外,他們還在積極地研究更多能夠給用戶的安全錦上添花的解決方案。