互聯網網站應該如何存儲密碼?

現在那麼多網站都因為暴庫導緻密碼泄露,CSDN甚至還是明文存儲密碼。那麼密碼應該怎麼保存才夠安全呢?有沒有可能資料庫被泄露後,密碼仍然不會被破解?

我更關注的是伺服器後台的實現,謝謝回答。


剛好堅果雲博客寫了一篇這樣的文章【1】, 講述如何存儲密碼才安全。完整內容可以查看【1】原文。

簡單而言,存儲bcrypt, scrypt等演算法輸出的內容,不要用salted hash的方式存儲密碼,不要用加密的方式存儲密碼,當然,更不要明文存儲。

順帶說一句,任何情況下儘可能的不要使用md5演算法,而使用SHA系列的哈希演算法。因為md5演算法在很多地方被證明是很容易衝突的【2】,另外md5的性能優勢也完全可以忽略不計。

為什麼不能加密存儲?

加密存儲的方式其實和明文存儲沒有區別。密碼加密後一定能被解密獲得原始密碼,因此,該網站一旦資料庫泄露,所有用戶的密碼本身就大白於天下。另外,管理員也存在獲取原始密碼,利用同樣的帳號登陸其他互聯網服務的可能。

為什麼不能用Hash存儲?

單向Hash演算法(MD5, SHA1, SHA256等)可以保證管理員幾乎不能恢復原始密碼。但它有兩個特點:

1)從同一個密碼進行單向哈希,得到的總是唯一確定的摘要

2)計算速度快。隨著技術進步,尤其是顯卡在高性能計算中的普及,一秒鐘能夠完成數十億次單向哈希計算

結合上面兩個特點,考慮到多數人所使用的密碼為常見的組合,攻擊者可以將所有密碼的常見組合進行單向哈希,得到一個摘要組合, 然後與資料庫中的摘要進行比對即可獲得對應的密碼。這個摘要組合也被稱為rainbow table【3】。

更糟糕的是,一個攻擊者只要建立上述的rainbow table,可以匹配所有的密碼資料庫。

為什麼不能用Salt + Hash的方式存儲?

將明文密碼混入「隨機因素「,然後進行單向哈希後存儲,也就是所謂的」Salted Hash」。

這個方式相比上面的方案,最大的好處是針對每一個資料庫中的密碼,都需要建立一個完整的rainbow table進行匹配。 因為兩個同樣使用「passwordhunter」作為密碼的賬戶,在資料庫中存儲的摘要完全不同。

10多年以前,因為計算和內存大小的限制,這個方案還是足夠安全的,因為攻擊者沒有足夠的資源建立這麼多的rainbow table。 但是,在今日,因為顯卡的恐怖的並行計算能力,這種攻擊已經完全可行。

為什麼bcrypt, scrypt等演算法能保證密碼存儲的安全性?

這類演算法有一個特點,演算法中都有個因子,用於指明計算密碼摘要所需要的資源和時間,也就是計算強度。計算強度越大,攻擊者建立rainbow table越困難,以至於不可繼續。

也就是說,故意延長一個密碼匹配的計算時間,如果一個密碼匹配需要1秒鐘,那麼匹配1000萬個密碼組合就需要115天,這個開銷就非常大。

另外,這類演算法也可以保證即使計算能力不斷提高,只要調整演算法中的強度因子,密碼仍然不可能被輕易的攻破,同時不影響已有用戶的登陸。關於這些演算法的具體優劣,請參考【1】

【1】 http://blog.jianguoyun.com/?p=438

【2】http://marc-stevens.nl/research/md5-1block-collision/

【3】http://en.wikipedia.org/wiki/Rainbow_table


顯然要用抵抗碰撞攻擊近似碰撞攻擊選擇前綴攻擊差分攻擊的hash啊,尼瑪連hash都不用直接名文存儲。頂你個肺啊。金融網站必然不能用md5。連王小雲論文都沒讀過還干毛線密碼啊。王小雲找到的兩輪碰撞已經被運用於實際攻擊。具體怎麼出事的我會亂說?請參考某病毒直接down掉了某核電站。目前sha3勝選演算法是可以用的。分析結果還很差。


密碼的類型和風險:

一、簡單的明文存儲;之前的泄露很多都是明文保存;

風險:

1、網站被攻破後可以直接看到用戶的明文;(想想下你的密碼比如生日等別直接公諸於眾的時候,一身冷汗)

2、密碼容易被網站的內部人員得知並獲取;(想像下後台的任何管理員都有辦法知道你的密碼,而且可以隨時登陸,還可以修改)

二、對明文做Hash後存儲;目前的很多bbs,各大網站的存儲方式如md5等;

優勢:

網站被攻破後,無法直接看到明文密碼,相對安全性更高;

風險:

1、雖然無法可以直接獲取明文,但可以通過窮舉,列表查詢方式獲取明文,md5的查詢庫是非常豐富的。

2、內部的管理人員可以通過編程模擬獲取投資人的密文,並通過窮舉等方式獲取明文,獲得用戶的登錄口令。

三、MD5+Salt方式

說明:

MD5(【明文】+【salt】)=【存儲在系統中的密文】

根據安全級別,可以設定系統級別的salt和用戶級別的salt。

可以Google說明【http://www.google.com/#hl=ennewwindow=1tbo=dsclient=psy-abq=MD5+salt+%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95oq=MD5+salt+%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95

優勢:

存儲在庫中的秘密為【明文】+【salt】做過的Hash,無法獲取原文明文;

劣勢:

1、實現稍複雜,需要系統在設計之初考慮好,也應該在系統設計之初就考慮好「用戶信息的安全是最重要的,尤其是密碼,及其他重要信息等」

2、MD5還是有被暴力破解的方式還是有的,可以增加難度更高的Hash演算法提高演算法窮舉的難度。


hash演算法多的是,隨便組合著用唄。。。


可以考慮和lastpass等合作,進行密碼託管。


bcrypt

http://en.m.wikipedia.org/wiki/Bcrypt

HMAC

http://en.m.wikipedia.org/wiki/Hash-based_message_authentication_code


推薦閱讀:

大數據是什麼意思?
做網上校園零食店,如何能夠儘快的搶佔市場?
在潮汕(潮州/汕頭/揭陽)IT/互聯網/軟體公司工作是一種什麼樣的體驗?
怎樣從零開始成為優秀的程序員?
2014 年有哪些值得推薦的年度 Android 遊戲?

TAG:互聯網 | 網頁設計 | 網站 | 密碼 | 信息安全和密碼學 |