淺談密碼存儲安全

jopen 9年前發布 | 11K 次閱讀 安全 安全相關

用戶信息泄露事件層出不窮,百度或谷歌輸入“密碼泄露”,搜出來的泄密門更是讓人目瞪口呆:從小公司到大公司,從明文存儲到普通的哈希加密。作為一個IT從業者,我深刻感受到“得用戶者得天下”,尤其在互聯網+盛行的趨勢下。密碼存儲作為軟件服務系統基礎架構中不可缺少的一部分,越來越多的受到開發者的重視。對于一個服務,如果信息安全部分出問題,我想沒有必要進一步去做用戶體驗的提升,性能的優化。進而也不可能獲取大用戶的青睞。還是那句話:出來混,遲早要還的。

前言

用戶信息泄露事件層出不窮,百度或谷歌輸入“密碼泄露”,搜出來的泄密門更是讓人目瞪口呆:從小公司到大公司,從明文存儲到普通的哈希加密。作為一個IT從業者,我深刻感受到“得用戶者得天下”,尤其在互聯網+盛行的趨勢下。密碼存儲作為軟件服務系統基礎架構中不可缺少的一部分,越來越多的受到開發者的重視。對于一個服務,如果信息安全部分出問題,我想沒有必要進一步去做用戶體驗的提升,性能的優化。進而也不可能獲取大用戶的青睞。還是那句話:出來混,遲早要還的。

本人并非密碼學出生,這篇文章不是用來介紹各種加密算法本身。寫這篇文章的目的,結合工作項目中一次大規模密碼加密遷移的親身體驗,主要是介紹軟件開發中常用的一些密碼存儲方法。

1. 用戶信息認證

有系統的地方就有用戶信息認證服務。用戶信息認證也經歷了一開始的每個系統提供自己的用戶信息認證,到多個系統采用統一的用戶信息認證(如LDAP),再到目前比較流行的第三方授權認證(如OAuth 2.0授權開放網絡標準)。

用戶信息的認證一個端到端的過程,從安全的角度看,更是一個端到端的安全認證過程:

  • 前端用戶信息輸入安全性:如密碼的長度要求,特殊字符組合要求,近期相似性匹配要求等

    </li>

  • 傳輸端用戶信息安全性:如https傳輸過程中會用到對稱加密,非對稱加密和哈希算法等各種手段盡可能多的保證數據是傳輸是安全的

    </li>

  • 后端用戶信息存儲安全性:如用戶密碼在后端數據庫中采用md5, sha1, sha256, bcrypt等存儲

    </li> </ul>

    本文淺談“后端用戶信息存儲安全性”中的敏感信息密碼存儲安全。

    2. 密碼加密

    2.1 哈希算法

    常用的一些處理密碼加密的算法有MD5, SHA1, SHA256, SHA512等。這些加密算法具有不可逆的特點(不能從密文反推出明文),具有等冪性(同樣的明文多次哈希得到相同的值)。輸入的微小變化會產生完全不相似的密文。算法計算速度快。一些典型的密碼泄密事件中,我們發現,很多就是采用這類算法進行密碼加密的。黑客常采用字典法或暴力法破解。

    單一哈希算法的密碼處理比較簡單,有些系統于是采用多次哈希處理:如md5(sha1(password)+md5(password))等。

    2.2 加鹽(salt)

    鹽是什么?

    鹽是一個隨機生成的字符串。由于采用上面哈希算法對密碼明文處理過于簡單。于是對密碼明文加上鹽,然后再用哈希算法處理。鹽可以加載明文的前面或者后面,或者根據一定的算法加在明文的不同的位置。由于對用戶的密碼采用隨機生成的鹽處理,因此相同的明文也會產生不同的密文。從黑客攻擊的角度上,進一步加大的破解的難度。

    鹽如何存儲?

    對于加鹽哈希算法,鹽一般也作為一個字段存儲在數據表里。而對于安全性更好一點的算法,鹽也可以隱藏在密文里,如bcrypt。

    3. 密碼破譯

    通過2章節,我們了解到一般情況下,密碼加密由兩部分構成:加密算法和鹽。而對于密碼破譯,一般常用的方法有:

    • 字典法:建立一個密碼明文字典,對于字典里的明文密碼一一匹配

      </li>

    • 暴力法:窮舉一定長度的明文密碼

      </li>

    • 查表法:建立密碼密文哈希表,然后對表查密文

      </li>

    • 逆向查表法:哈希不同的密碼明文,匹配具有該密碼明文的用戶

      </li>

    • ...

      </li> </ul>

      深入了解這些常用的破譯方法,請參考:https://crackstation.net/hashing-security.htm

      其實不管采用何種方法對密碼加密,在足夠長的時間里,都是可以破譯的。因此密碼存儲安全,只有相對的安全。安全的代價是性能。

      我們來看個例子(來自網上數據):

      假設密碼由小寫字母和數字組成。對于一個長度為6的密碼采用MD5加密,根據計算機的計算性能不同,采用暴力破解一般在幾秒和幾十秒之間。但如果采用bcrypt(work factor設為12)加密,采用暴力破解則需12年左右。

      到這里,我們可以看到,為什么密碼加密強力推薦采用bcrypt,加密算法不慢不快(可以通過factor進行調節),如果采用上述密碼破譯方法進行破譯,需要付出時間代價。相對來說安全。而普通的哈希算法,加密速度太快。對于一臺現代計算能力強的計算機來說,簡單的密碼非常容易暴力破解。

      4. 密碼遷移過程

      這里密碼算法遷移是指對于線上系統,從一種已有的密碼加密算法遷移到另外一種密碼加密算法。

      密碼遷移過程,結合實際項目,介紹一種密碼遷移的方法,適用于:對于一個已經龐大的線上系統,密碼存儲采用相對不太安全的加鹽的哈希算法。現在的需求是要把密碼存儲策略改成相對更安全的bcrypt算法。

      • 數據表前期處理:我們會在密文數據表中加入兩個字段(如hashfunc, bcrypthash)分別表示加密算法類型和加密后的密文,注意假設表中原來的密文以字段passwordhash存儲。

        </li>

      • 老用戶處理:第一輪我們會對線上數據表中做一輪遷移,把老用戶的passwordhash遷移到bcrypthash里。遷移的方法可以采用bcrypt(passwordhash)進行,因為我們無法得知密碼的明文。只能依托密文進一步再加密來填充bcrypthash。

        </li>

      • 新用戶和更新用戶處理:對于能夠創建用戶,更新用戶信息和驗證用戶信息的組件,需要相應的改動。新用戶創建和更新方面,直接按照bcrypt(password)產生密文填充bcrypthash。用戶信息驗證方面,根據hashfunc的類別,進行相應的計算。

        </li>

      • 數據表后期處理:最后我們會對數據表再做一輪遷移,把不再需要的字段passwordhash刪掉。

        </li> </ul>

        整個遷移過程并不復雜,難點在于流程控制,除了數據庫本身,具有用戶信息處理的組件可能也要做相應的處理。整個遷移的過程中,我們需要保證,任何階段,對于老用戶,新用戶,更新密碼的用戶都可以正常工作。

        總結

        本文淺談密碼存儲安全中的一些常識。正是因為密碼存儲安全是相對的,所以我們在實際項目中采取何種算法加密應該根據實際需要,相對的安全也是建立在性能之上。


        來自:http://my.oschina.net/hjh188/blog/491666

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!