2013-08-31 29 views
10

我寫了一個小型web服務器,該服務器當前使用基於ssl的基本身份驗證。迄今爲止,一切都很好。現在我想(需要)切換到摘要身份驗證。但我無法弄清楚如何使用未在數據庫中存儲爲明文的密碼進行這項工作?我只有我的用戶密碼存儲的密碼摘要(使用bcrypt生成)。 HTTP摘要認證可能嗎?數據庫和瀏覽器摘要驗證中的加密密碼

回答

11

剛纔正在研究這個。首先,我通過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的基本身份驗證獲得了任何額外的安全層?

+0

很久以後,我知道這個事件,但奇妙的澄清 - 我通常避免做出驅動器的噪音'感謝'的評論,但這真的幫助我瞭解摘要認證的侷限性:) – ChrisV