HTTP摘要式身份验证

我想使用HTTP摘要式身份验证和存储用户名和加密密码的中央数据库。 这些数据应该由不同的服务器使用,例如Apache httpd或Tomcat。 客户端将是具有浏览器和其他应用程序以RESTful方式通信的人类。

据我所知,我不能使用哈希密码表。 只有在需要明文密码的情况下才可能存储HA1 = MD5(用户名:realm:密码) - 正确?

另一方面,似乎可以在Apache httpd中使用哈希密码:

Apache httpd文档说:

查询语句返回的第一行的第一列值应该是包含加密密码的字符串。

它是否适用于摘要身份验证? 没有指定散列算法的参数。 Apache httpd如何决定使用哪种算法?

RFC 2617说:

4.13存储密码

摘要式身份验证要求身份验证代理(通常是服务器)将从用户名和密码派生的一些数据存储在与给定领域关联的“密码文件”中。 通常这可能包含由用户名和H(A1)组成的对,其中H(A1)是如上所述的用户名,领域和密码的消化值。

听起来密码必须是明文。

Servlet 3.0规范说:

尽管密码不是通过网络发送的,但HTTP摘要认证要求明文密码等同于认证容器,以便它可以通过计算预期的摘要来验证接收到的认证者。

什么是“明文密码等值”在这里? 密码哈希?

Tomcat文档说:

如果使用DIGEST认证使用消解密码,用于生成摘要的明文不同。 在上面的示例中,{cleartext-password}必须替换为{username}:{realm}:{cleartext-password}。 例如,在开发环境中,这可能采用testUser:localhost:8080:testPassword的形式。

这是一个明文密码需要。

那么,可以将HTTP Digest身份验证与已加密的密码一起使用,还是将密码设置为明文?

如果用户请求来自不同子域的页面,用户是否必须重新输入凭据?

浏览器在标签页关闭时还是仅在整个关闭时才删除缓存的密码? 也许这不同于浏览器到浏览器 - 我会对哪个浏览器删除它并保留它感兴趣。

总体问题是,摘要身份验证是否适合我的情况,即具有已加密密码的中央用户数据库。 还是应该更好地使用基于会话的单点登录服务?


在这种情况下,您已经拥有散列密码的数据库,只要不使用相同函数进行散列,就不可能使用摘要式身份验证。

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

  • Cookie可以设置为在子域名之间使用:http://en.wikipedia.org/wiki/HTTP_cookie#Cookie_attributes
  • 会话将一直有效,直到用户关闭浏览器,超时过期或用户单击注销按钮。 永远不要忘记提供这个选项给你的用户!

  • 我认为你可以首先用用户输入的密码来散列用于存储密码到数据库中的相同函数,然后将它作为摘要密码传递,其余过程将是相同的。

    并且您将不得不在HTTP URL中传递用户名和密码,而不是正常形式http://www.rojotek.com/blog/2008/05/19/http-authentication-in-a-url/

    链接地址: http://www.djcxy.com/p/497.html

    上一篇: HTTP Digest Authentication

    下一篇: What is token based authentication?