網站登錄密碼的安全性問題小結


最近在做一個小系統,需要用戶登錄功能。雖然系統對安全性要求並不高,但是希望借此機會增長下安全方面的知識,因為網絡信息安全對於編程甚至對日常生活都很重要。於是就搜索一下網上關於登錄密碼安全防護的一些網頁,在這里進行一下整理和總結。由於我對安全方面的知識只有較粗淺的了解,因此這里給出了覺得比較有參考價值的文章的鏈接,請想深入了解的人還是親自參考下那些文章,或者延伸閱讀更專業、詳盡的書籍、資料。另外,我在查資料的過程中曾經看過一個CSDN上的帖子,樓主說的內容大約是在詢問有什么方法能夠保證密碼的安全,而底下的大多回復卻在抨擊這種想法,覺得密碼安全無法得到完全解決,考慮這個問題太耗費開發精力,使用明文傳輸密碼也沒什么大不了反正新浪郵箱就用的明文雲雲。竊以為這種想法不可取。我並不否認某些應用中並不需要過高的安全級別,過多考慮安全問題反而會消耗開發成本(其實我所開發的項目大約也是如此)。但畢竟並不是所有應用都對安全要求不高,並不是所有人都對安全漠不關心。能盡自己所能作多一點防護也沒什么不好。多的就不說了,總之我還是比較鼓勵人不斷探索。

 

首先推薦一個很綜合的討論的鏈接:

http://segmentfault.com/q/1010000000095307

 

綜合起來,密碼的安全主要存在於三個方面:

  • 數據庫中存儲密碼的安全性
  • 密碼在網絡中傳輸的安全性
  • 密碼在瀏覽器端輸入的安全性(本文暫不討論)

 

數據庫中存儲密碼的安全性

有一篇文章可以算是概括了這一議題:

http://zhuoqiang.me/password-storage-and-python-example.html

簡單的說,數據庫中密碼的安全性就是假如有黑客盜取了你的數據庫的數據,你如何讓黑客無法破解用戶的密碼信息。

最簡單的方法,就是在數據庫中使用明文來存儲用戶名密碼(前一段時間CSDN的密碼泄漏事件算是炸開了鍋,更令人吃驚的是國內第一技術網站竟然使用這種低級的方法)。這種方法非常容易破解,只要得到了用戶數據,任何人直接就能獲得密碼信息。

第二種方法是對密碼進行加密(如使用MD5、SHA算法)之后存儲在數據庫中。這種方法對於較復雜的密碼來說黑客束手無策,但對於較常見的密碼黑客在得到了數據之后依然能有效破譯。有一些好事者將用戶常用的密碼總結出來,再使用這些加密算法得出其加密后的值,稱其為彩虹表。黑客只需要用彩虹表與加密后的密碼比對,依然能得到用戶的原始密碼。

為了克服第二種方法的缺陷,使得常見密碼也能得到保護,人們發明了第三種方法:使用salt來混淆加密后的值。大體方法是,每次寫入用戶的密碼時(如注冊或修改密碼),隨機生成一個salt值(可能是一個隨機字串或者大整數等等),並將salt與密碼混合(可以是各種混合方式而不僅限於將兩個串連接在一起),再進行哈希。這樣,即使黑客擁有了彩虹表,也不能立即猜測出哪些哈希值對應哪些常規的密碼,因為即使用戶輸入了常規密碼,混合了salt的哈希值已經與之前大相徑庭,而在salt值對於不同用戶各異的情況下(如果所有用戶的salt值都一樣且混淆方法已知那么黑客依然可以針對常見密碼與salt混合生成一個具有針對性的彩虹表),也難以對所有用戶生成一個彩虹表。但黑客依然可以針對某一個用戶,使用暴力窮舉的方式,來破譯密碼。如果用戶的密碼長度較短且全是數字的話,由於搜索空間較小且MD5、SHA等算法由於本身特性加密過程比較快,破譯也並不難。

為了克服第三種方法的缺陷,第四種方法延長了加密算法的執行時間:或者使用“stretching”增加普通MD5等快速算法的迭代次數,或者使用bcrypt這樣的執行時間可配置的加密算法,來迫使黑客在暴力破譯的時候需要更長的時間。由於將加密算法控制在微秒級即可給黑客的破譯帶來災難性打擊而同時單個用戶登錄時驗證的耗時又不算太長,這種方法可以說有效的解決了黑客破譯密碼的危險。

salt與彩虹表的內容有一篇文章講得比較詳細:
  http://www.libuchao.com/2013/07/05/password-salt

關於bcrypt算法可見
http://codahale.com/how-to-safely-store-a-password/

其論文見

https://www.usenix.org/legacy/events/usenix99/provos.html

這篇文章講了php中一個通用的考慮了以上所有問題的登錄驗證包phpass及其驗證原理,還包括一些驗證安全的通用議題,還講到了如何使用輸入過濾與prepared statement結合來防止SQL注入:
http://www.openwall.com/articles/PHP-Users-Passwords

不過筆者有一個小小的疑問,做了這么多都是為了防止黑客在得知了用戶數據表之后如何防止其進一步得知用戶的登錄密碼。但再進一步說,既然黑客都得到了用戶數據表了,那么是不是也能得到其他信息呢?黑客想登陸到你的帳戶無非也是為了獲取甚至更改你的數據(至少很多時候這樣),那么數據庫本身的安全是不是比用戶密碼存儲方式的設計更重要呢。看來安全並不是一個三言兩語能講完的議題,由於本文只關注密碼在存儲與傳輸過程中的安全,所以這些內容就只能暫時忽略了。

 

密碼在網絡中傳輸的安全性

一篇概括性講解:

http://zhuoqiang.me/password-transport.html

傳輸過程中的安全性可能比較數據庫存儲的安全性更重要,因為網絡中的數據包極有可能被黑客截獲。

最不可取的方法就是使用明文傳輸密碼,黑客可以輕松截獲http傳輸的數據並獲知密碼(且不談黑客如何從海量數據中獲取和分析與登錄密碼相關的數據)。

進行加密傳輸后依然能被輕松攻擊,黑客截獲后,即使不分析出密文所對應的明文,只要構造相同的http請求使用所謂的“回放攻擊”,就能輕松登錄用戶的賬戶。

解決這種傳輸中安全問題的終極方案是使用https協議加密傳輸。只要在客戶端輸入時密碼不被竊取,且ssl協議的私鑰安全,這種協議就是安全的。

值得一提的是,為了避免回放攻擊,可以使用nonce來解決(參見http://doc.okbase.net/parry/archive/5619.html)。這種方式雖然應用在了http自帶的認證中,普通的用戶登錄認證也可以仿效。但是這種方法貌似還是不如https來得安全。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM