HTTP摘要式身份验证

时间:2010-01-21 12:59:53

标签: security apache http authentication digest

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

据我所知,我无法使用带有散列密码的表格。只能将HA1 = MD5(username:realm:password)存储在需要明文密码的地方 - 对吗?

另一方面,似乎可以在Apache httpd:

中使用散列密码

Apache httpd doc说:

  

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

是否可以使用摘要式身份验证?没有参数来指定哈希算法。 Apache httpd如何决定使用哪种算法?

RFC 2617说:

  

4.13存储密码

     

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

听起来密码必须是明文。

Servlet 3.0规范说:

  

虽然没有发送密码   有线,HTTP摘要认证   需要明文密码   等价物是可以的   验证容器以便它   可以验证收到的验证者   通过计算预期的摘要。

这里的“明文密码等效”是什么?密码哈希?

Tomcat documentation说:

  

如果使用消化密码   DIGEST身份验证,明文   用于生成摘要的是   不同。在上面的例子中   必须替换{cleartext-password}   同   {用户名} {}境界:{明文密码}。   例如,在开发中   环境可能采取这种形式   为testUser:本地主机:8080:testPassword

这是一个需要明文密码。

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

我认为您可以首先使用与在数据库中存储密码相同的函数来散列用户输入的密码,然后将其作为摘要密码传递,其余程序将相同。

并且您必须在HTTP URL而不是普通表单中传递用户名和密码 http://www.rojotek.com/blog/2008/05/19/http-authentication-in-a-url/