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

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

 

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

http://segmentfault.com/q/1010000000095307python

 

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

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

 

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

有一篇文章能夠算是歸納了這一議題:編程

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

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

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

第二種方法是對密碼進行加密(如使用MD五、SHA算法)以後存儲在數據庫中。這種方法對於較複雜的密碼來講黑客一籌莫展,但對於較常見的密碼黑客在獲得了數據以後依然能有效破譯。有一些好事者將用戶經常使用的密碼總結出來,再使用這些加密算法得出其加密後的值,稱其爲彩虹表。黑客只須要用彩虹表與加密後的密碼比對,依然能獲得用戶的原始密碼。網絡

爲了克服第二種方法的缺陷,使得常見密碼也能獲得保護,人們發明了第三種方法:使用salt來混淆加密後的值。大致方法是,每次寫入用戶的密碼時(如註冊或修改密碼),隨機生成一個salt值(多是一個隨機字串或者大整數等等),並將salt與密碼混合(能夠是各類混合方式而不只限於將兩個串鏈接在一塊兒),再進行哈希。這樣,即便黑客擁有了彩虹表,也不能當即猜想出哪些哈希值對應哪些常規的密碼,由於即便用戶輸入了常規密碼,混合了salt的哈希值已經與以前截然不同,而在salt值對於不一樣用戶各異的狀況下(若是全部用戶的salt值都同樣且混淆方法已知那麼黑客依然能夠針對常見密碼與salt混合生成一個具備針對性的彩虹表),也難以對全部用戶生成一個彩虹表。但黑客依然能夠針對某一個用戶,使用暴力窮舉的方式,來破譯密碼。若是用戶的密碼長度較短且全是數字的話,因爲搜索空間較小且MD五、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來得安全。

相關文章
相關標籤/搜索