关于安全性:HTTP摘要式身份验证

HTTP Digest Authentication

我想将HTTP摘要身份验证与存储用户名和加密密码的中央数据库一起使用。这些数据应该由不同的服务器使用,例如ApacheHTTPD或Tomcat。客户机将是浏览器和其他应用程序的人,以一种宁静的方式进行通信。

据我所知,我不能使用具有哈希密码的表。只可能将ha1=md5(用户名:领域:密码)存储在需要明文密码的地方-正确吗?

另一方面,ApacheHTTPD似乎可以使用哈希密码:

Apache HTTPD文档说:

The first column value of the first
row returned by the query statement
should be a string containing the
encrypted password.

它与摘要式身份验证一起工作吗?没有指定哈希算法的参数。ApacheHTTPD如何决定使用哪种算法?

RFC2617说:

4.13 Storing passwords

Digest authentication requires that
the authenticating agent (usually
the server) store some data derived
from the user's name and password
in a"password file" associated with a
given realm. Normally this might
contain pairs consisting of username
and H(A1), where H(A1) is the
digested value of the username, realm,
and password as described above.

听起来密码必须是明文。

servlet 3.0规格说明:

Although passwords are not sent on the
wire, HTTP Digest authentication
requires that clear text password
equivalents be avaialble to the
authenticating container so that it
can validate received authenticators
by calculating the expected digest.

这里的"明文密码等价物"是什么?密码哈希?

Tomcat文档显示:

If using digested passwords with
DIGEST authentication, the cleartext
used to generate the digest is
different. In the examples above
{cleartext-password} must be replaced
with
{username}:{realm}:{cleartext-password}.
For example, in a development
environment this might take the form
testUser:localhost:8080:testPassword.

这里需要明文密码。

那么,是否可以将HTTP摘要身份验证与已经加密的密码一起使用,或者将密码设置为明文?

如果用户从其他子域请求页面,则必须重新输入其凭据吗?

浏览器是在关闭选项卡时还是仅在关闭整个选项卡时删除缓存的密码?也许这在不同的浏览器之间是不同的-我会对哪个浏览器删除它和保存它感兴趣。

总的问题是,摘要式身份验证是否适合我的场景,我的场景使用的是一个已经加密密码的中央用户数据库。还是应该更好地使用基于会话的单点登录服务?


在您已经拥有哈希密码数据库的这种情况下,不可能使用摘要式身份验证,因为它们没有使用相同的函数进行哈希。

我认为最好的解决方案是创建一个登录页面,并使用cookie会话来控制用户的权限。通过这个解决方案,您可以得到其他问题的答案:

  • 可以将cookie设置为在子域之间使用:http://en.wikipedia.org/wiki/http cookie cookie属性
  • 在用户关闭浏览器、超时时间到期或用户单击"注销"按钮之前,会话将一直有效。永远不要忘记向您的用户提供此选项!!!!


我想你可以先用数据库中存储密码的相同函数散列用户输入的密码,然后将其作为摘要密码传递,剩下的过程将是相同的。

你必须在HTTP URL中传递用户名和密码,而不是普通格式http://www.rojotek.com/blog/2008/05/19/http-authentication-in-a-url/