我寫了一個小型web服務器,該服務器當前使用基於ssl的基本身份驗證。迄今爲止,一切都很好。現在我想(需要)切換到摘要身份驗證。但我無法弄清楚如何使用未在數據庫中存儲爲明文的密碼進行這項工作?我只有我的用戶密碼存儲的密碼摘要(使用bcrypt生成)。 HTTP摘要認證可能嗎?數據庫和瀏覽器摘要驗證中的加密密碼
回答
剛纔正在研究這個。首先,我通過RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication閱讀了解規範,並瞭解它如何適用於REST API認證。
與您一樣進入相同的問題摘要驗證是否意味着服務器需要以明文存儲用戶密碼?
This堆棧溢出的答案清楚:號服務器不存儲明文密碼 - it should store the hash of (username|realm|password)
。
除了一件事情之外,這將會很好 - 規範規範只支持使用MD5作爲散列函數。
當然,你可以存儲都的bcrypt哈希和 MD5哈希,但這樣做只會破壞bcrypt哈希有效地使安全無用(因爲攻擊者可以通過他的努力轉移到暴力破解MD5哈希代替)。
所以,我向後退了一步,心想:爲什麼不忽略規範和使用bcrypt上都雙方作爲哈希函數(bcrypt(username|realm|password)
)?
那麼,除了有目的地慢,bcrypt has a maximum password length其中makes it unsuitable for use as a general digest algorithm。
哎,現在我的頭在游泳,但我還是想再給它一次。其中一些建議是使用帶有SRP的TLS或經過驗證的加密,尤其是EAX,但是我覺得可能這些對於簡單的Web服務來說太過分了。
簡而言之,如果你真的想要做到這一點,你可以work around bcrypt's character limitation by using a preliminary hash。
長話短說,似乎你可以做:
bcrypt(sha256(username|realm|password))
而在規範的bastardized版本中使用,在地方H(A1)
。
現在的問題是 - 所有這些增加了複雜性真的值得嗎?我們是否通過基於HTTPS的基本身份驗證獲得了任何額外的安全層?
- 1. HTTP摘要驗證單向加密密碼
- 2. 在mysql中使用加密存儲密碼的摘要式驗證
- 3. BCrypt驗證數據庫中密碼的密碼
- 4. 驗證用戶密碼與數據庫中的密碼匹配
- 5. Node.js加密和瀏覽器端解密
- 6. MySQL密碼加密驗證
- 7. 驗證grails中的加密密碼
- 8. 驗證POST參數後阻止瀏覽器密碼緩存
- 9. 密碼使用bcrypt驗證數據庫
- 10. 加密SQLite數據庫中的密碼?
- 11. 驗證碼加密
- 12. 要驗證密碼的JavaScript
- 13. 使用Java庫jasypt摘要加密密碼
- 14. 在瀏覽器中加密/解密二進制數據
- 15. Javascript密碼庫在瀏覽器中籤署表單數據
- 16. 安全的數據加密和驗證
- 17. 瀏覽器加密服務器解密
- 18. 在瀏覽器中記住密碼和自動完成密碼
- 19. 在數據庫中加密密碼
- 20. 在apache2 webserver中更改密碼 - 摘要式身份驗證
- 21. 驗證在asp.net數據庫中的用戶名和密碼
- 22. 驗證數據庫中的用戶名和密碼
- 23. SPRING MVC數據和密碼驗證
- 24. 從數據庫驗證硬編碼的密碼和用戶名
- 25. android ICS:用於保存瀏覽器密碼的數據庫?
- 26. 數據庫加密和數據庫解密使用C#代碼
- 27. 如何驗證密碼和confrm密碼
- 28. 驗證密碼和確認密碼NG2
- 29. 使用摘要密碼的WSO2is身份驗證SOAP
- 30. 加密數據庫上的密碼
很久以後,我知道這個事件,但奇妙的澄清 - 我通常避免做出驅動器的噪音'感謝'的評論,但這真的幫助我瞭解摘要認證的侷限性:) – ChrisV