互聯網網站應該如何存儲密碼?
現在那麼多網站都因為暴庫導緻密碼泄露,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/BcryptHMAChttp://en.m.wikipedia.org/wiki/Hash-based_message_authentication_code推薦閱讀:
※大數據是什麼意思?
※做網上校園零食店,如何能夠儘快的搶佔市場?
※在潮汕(潮州/汕頭/揭陽)IT/互聯網/軟體公司工作是一種什麼樣的體驗?
※怎樣從零開始成為優秀的程序員?
※2014 年有哪些值得推薦的年度 Android 遊戲?