安全存儲密碼:Hashing 還是加密?
對于網站來說, 再沒有什么比用戶信息泄露更讓人尷尬的了。 尤其是當存有用戶密碼的文件如果被黑客獲取, 對網站的安全和用戶的信心來說都是巨大的打擊。 如最近的Ebay泄密事件和小米的用戶數據泄露事件。 保證用戶信息安全首先需要正確理解對于用戶密碼的安全控制和保護。 這里OWASP的主席Michael Coates最近的一篇關于一些基本概念的介紹能夠幫助開發人員更好的理解現代Hashing算法和加密對于用戶密碼保護的作用。 安全牛編譯如下:
在過去幾個月, 我們看到了一些嚴重的數據泄露事件, Ebay和Adobe的數據泄露事件影響了幾百萬用戶。 Snapchat也遭受到了數據泄露事件的影響。 每一次密碼泄露事件后, 人們都會問同一個問題, 這些密碼的存儲是不是安全? 不幸的是, 這個看上去簡單的問題其實并不好回答。
盡管在很多情況下, Hashing和加密都能夠滿足安全存儲的需要, 對于在線應用而言, 很多情況下, 對于用戶密碼的安全存儲往往只有一種正確的方案。 Hashing.是通過一個不可逆的雜湊函數計算出一個Hash值, 而通過這個值無法逆向計算出輸入值(比如用戶密碼)。 對稱加密則是采用密鑰進行加密計算, 這是一種可逆的運算。 任何人如果有了密鑰, 就能夠解密出原始明文。
下表是Hashing和對稱加密的對比
|
Hashing |
對稱加密 |
---|---|---|
不可逆函數 | 可逆運算 | |
能夠逆向算出初始值 | 不能 | 可以 |
對于現代雜湊算法而言, 從Hash值逆向算出輸入值非常困難。 參見下面關于彩虹表,鹽化等的討論 |
對稱加密就是設計來是的任何擁有密鑰的人能夠解密出原始明文 | |
其他需要考慮的方面 | 雜湊算法的選擇 | 加密算法的選擇 |
對每個用戶進行鹽化 | 保護密鑰 | |
顯示第 1 至 6 項結果,共 6 項
當在線應用收到一個用戶名和一個密碼后, 就以密碼為輸入到雜湊函數中去得出一個Hash值, 然后用這個Hash值與數據庫中存儲的該用戶的密碼Hash值做比較, 如果兩個Hash值相同, 就可以認為用戶提供了有效的用戶名和密碼。 采用Hashing的好處是, 應用不需要存儲用戶的明文密碼, 只需要存儲Hash值。
在線應用如何利用密碼的Hash值來認證用戶
下圖就是關于采用Hashing方式的簡單描述:
那么, 所有雜湊算法都能用嗎? 不是的, 事實上, 雜湊算法中不同的算法的差別很大, 并不是所有的雜湊算法都適合存儲密碼。
說起來可能有點出人預料, 早期的雜湊算法速度過快, 黑客們盡管不能通過Hash值逆向計算出原輸入值, 但是黑客們可以通過暴力破解的方式遍歷所有可能的密碼組合來嘗試能夠能夠“碰撞”到用戶密碼的Hash值。 為了避免這種威脅, 現代的雜湊算法能夠通過多重迭代, 使得在每次Hash計算時產生一些延時, 對單次Hash計算, 這樣的延時基本沒有任何影響, 而對于黑客的暴力破解來說, 幾百萬次計算的延時能夠被放大幾百年, 這樣到使得暴力破解基本不現實的地步。
在Hashing中, 最好采用針對每個用戶的鹽化方式, 通過對用戶密碼添加一個隨機字符串(隨機字符串可以是顯式存儲), 這樣可以相同的密碼產生相同的Hash值, 這樣, 攻擊者可以下載一個巨大的存有事先計算好Hash值的查找表, 也叫做彩虹表。 通過Hash值, 反向查找對應的輸入值。
而通過下面兩個表格可以看出, 通過對不同用戶進行不同的鹽化, 同樣的密碼就會出現不同的Hash值, 這樣使得攻擊者利用彩虹表進行攻擊變得困難。
沒有鹽化
用戶名 |
密碼 |
Hash值 |
---|---|---|
Joe | password123 | xyfkdl323... |
Sue | password123 | xyfkdl323... |
鹽化后
用戶名 |
密碼 |
鹽化字符串 |
Hash值 |
---|---|---|---|
Joe | password123 | 48a023jl2… | ied390fl2... |
Sue | password123 | 9fh3ls321… | 40akdl23… |
類似于賬戶鎖定的機制對于密碼存儲的模式有什么影響嗎?
簡單的回答, 就是, 沒有影響。 對密碼的安全存儲是為了提供在密碼文件被盜取后的防護。 黑客對于密碼Hash的攻擊是一種離線攻擊。 也就是說, 密碼文件已經被盜取, 黑客可以利用自己的計算機通過嘗試不同的密碼來找出密碼。 由于是離線攻擊, 賬號鎖定或者驗證碼之類的安全機制已經沒有作用了。 這些機制只有在針對網站服務器的在線登錄頁面攻擊時才會起作用。
對于密碼存儲, 采用對稱加密而不是Hashing的風險在哪里?
對稱加密的設計就是一個可逆的運算, 這意味著在線應用必須能夠訪問到密鑰, 并且在每次密碼驗證時都要使用。 如果加密后的密碼被竊取的話, 黑客需要獲取對稱加密的密鑰, 而一旦密鑰被破解出來, 不管是通過某種方式泄露出來, 或者一些弱的密鑰被暴力方式破解出來, 所有的密碼都會被黑客獲得。
總結
對于密碼的安全存儲來說, 理解對稱加密與Hashing的區別非常重要。 一些如PBKDF2, bcrypt以及scrypt等算法都采用的每用戶鹽化以及多重迭代的Hashing方式以安全存儲密碼。
互聯網已經日益成為重要的用戶信息存儲的場所。 網站開發人員及網站老板們需要盡其所能地保證用戶信息的安全。 了解如何利用現代的Hashing算法對用戶密碼進行基本的安全控制保護非常重要。
來自:安全牛