我想将 HTTP Digest Authentication 与存储用户名和加密密码的中央数据库一起使用。这些数据应该由不同的服务器使用,例如 Apache httpd 或 Tomcat。客户端将是具有浏览器和其他应用程序以 RESTful 方式进行通信的人。
据我了解,我无法使用带有散列密码的表。只有在需要明文密码的地方才可能存储 HA1 = MD5(username:realm:password) - 对吗?
另一方面,似乎可以在 Apache httpd 中使用散列密码:
查询语句返回的第一行的第一列值应该是包含加密密码的字符串。
它适用于摘要身份验证吗?没有指定散列算法的参数。Apache httpd 如何决定使用哪种算法?
RFC 2617说:
4.13 存储密码
摘要式身份验证要求身份验证代理(通常是服务器)将一些从用户名和密码派生的数据存储在与给定领域关联的“密码文件”中。通常这可能包含由用户名和 H(A1) 组成的对,其中 H(A1) 是如上所述的用户名、领域和密码的摘要值。
听起来密码必须是明文。
Servlet 3.0 规范说:
尽管密码不是在线发送的,但 HTTP Digest 身份验证要求身份验证容器可以使用明文密码等效项,以便它可以通过计算预期的摘要来验证接收到的身份验证器。
这里的“明文密码等效”是什么?密码哈希?
如果使用带有 DIGEST 身份验证的摘要密码,则用于生成摘要的明文是不同的。在上面的示例中,{cleartext-password} 必须替换为 {username}:{realm}:{cleartext-password}。例如,在开发环境中,这可能采用 testUser:localhost:8080:testPassword 的形式。
这里需要一个明文密码。
那么,HTTP Digest 身份验证可以与已经加密的密码一起使用还是让密码为明文?
如果他从不同的子域请求页面,用户是否必须重新输入他的凭据?
浏览器是在关闭选项卡时删除缓存的密码还是仅在整个关闭时才删除?也许这因浏览器而异 - 我会对哪个浏览器删除它以及保留它感兴趣。
总体问题是,摘要式身份验证是否适合我的场景,其中中央用户 db 已经加密了密码。还是我应该更好地使用基于会话的单点登录服务?