【问题标题】:Encrypted password in database and browser digest auth数据库和浏览器摘要身份验证中的加密密码
【发布时间】:2013-09-04 07:22:53
【问题描述】:

我写了一个小型网络服务器,目前使用基本身份验证而不是 ssl。到目前为止,一切都很好。现在我想(需要)切换到digest auth。但是我不知道如何使用未在数据库中以明文形式存储的密码来完成这项工作?我只存储了用户密码的密码摘要(使用 bcrypt 生成)。 http digest auth 有可能吗?

【问题讨论】:

  • 我从未见过使用 Digest Auth 的人。只是好奇:你的用途是什么?与 Base+HTTPS 相比有什么优势吗?

标签: bcrypt digest-authentication


【解决方案1】:

刚才正在研究这个。首先,我通读了RFC 2617 - HTTP Authentication: Basic and Digest Access Authentication 以深入了解该规范,并了解它如何适用于 REST API 身份验证。

遇到了和你一样的问题——摘要式身份验证是否意味着服务器需要以明文形式存储用户密码?

This Stack Overflow 的回答很清楚:没有。服务器不存储明文密码it should store the hash of (username|realm|password)

除了一件事——规范规范只支持使用 MD5 作为散列函数之外,那本来可以的。

当然,您可以存储 both 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))

并在规范的混蛋版本中使用它来代替 H(A1)

现在的问题变成了——所有这些增加的复杂性真的值得吗?我们是否通过 HTTPS 的基本身份验证获得了任何额外的安全层?

【讨论】:

  • 事件发生很久之后,我知道,但非常棒的澄清——我通常避免让驾驶噪音“感谢”cmets,但这确实帮助我理解了摘要身份验证的局限性:)
  • 感谢您的回答,证实了我的恐惧。我有一个需要支持摘要式身份验证的旧版应用程序。我希望将我们的密码存储转移到 Bcrypt,但我想这是不可能的。 叹息
【解决方案2】:

现在的问题变成了——所有这些增加的复杂性真的值得吗?我们是否通过 HTTPS 的基本身份验证获得了任何额外的安全层?

我可以看到一个,当您使用基本身份验证时,您的 HTTP 客户端将 Authorization 标头发送为 base64(password)

因此,如果您打开网络浏览器,并且有人打开浏览器网络控制台,他可以对您的密码进行 base64 解码。

而对于摘要身份验证,授权标头是 md5 哈希(并且包含随机数哈希以防止重放攻击)

【讨论】:

  • 好点。此外,服务器日志可能会无意中捕获Authorization 标头并暴露base64(password),因此在这种情况下,即使只是一个MD5 哈希也会增加一定的安全级别。 (我放弃了我的询问线,只使用了不透明的会话令牌或 JWT。)
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 2023-03-21
  • 2010-12-08
  • 2020-05-23
  • 2014-05-30
  • 1970-01-01
  • 2011-05-08
  • 2010-10-24
相关资源
最近更新 更多