我写了一个小型的Web服务器,目前使用基本认证和SSL。到目前为止,一切都很顺利。现在我想(需要)切换到摘要认证。但是,我不知道如何将这种方法与数据库中未以明文形式存储的密码结合起来使用。我只有用户密码的密码摘要(使用bcrypt生成)存储在数据库中。是否可以使用HTTP摘要认证?
我写了一个小型的Web服务器,目前使用基本认证和SSL。到目前为止,一切都很顺利。现在我想(需要)切换到摘要认证。但是,我不知道如何将这种方法与数据库中未以明文形式存储的密码结合起来使用。我只有用户密码的密码摘要(使用bcrypt生成)存储在数据库中。是否可以使用HTTP摘要认证?
我刚才在看这个。首先,我阅读了RFC 2617 - HTTP身份验证:基本和摘要访问认证来了解规范并了解如何将其适应于REST API身份验证。
我遇到了你所遇到的同样的问题——摘要身份验证是否意味着服务器需要以明文存储用户密码?
这个 Stack Overflow答案清楚地表明:不是的。服务器不会存储明文密码——它应该存储 (用户名|域|密码)
的哈希值。
那本来是没问题的,但有一个问题——规范只支持使用MD5作为哈希函数。
当然,你可以同时存储bcrypt哈希和MD5哈希,但这样做只会破坏bcrypt哈希的安全性,从而使其无效(因为攻击者可以转移他的努力去暴力破解MD5哈希)。
所以,我退了一步,想,为什么不无视规范,在两个方面都使用bcrypt作为哈希函数(bcrypt(用户名|域|密码)
)?
好吧,除了故意变慢之外,bcrypt有一个最大密码长度,这使得它不适合用作通用摘要算法。
哇,现在我头晕目眩了,但我仍然想再试一次。其中一些建议是使用TLS与SRP或经过身份验证的加密,特别是EAX,但我觉得也许这些对于一个简单的Web服务来说有点过分了。
简而言之,如果你真的想做到这一点,可以通过使用预处理哈希解决bcrypt的字符限制问题。
长话短说,看起来你可以做到:
bcrypt(sha256(username|realm|password))
在规范的变种中,使用它替代H(A1)
。
现在问题变成了 - 所有这些增加的复杂性真的值得吗?相比于基本身份验证在 HTTPS 上,我们是否获得了任何额外的安全层?