好的,经过一番试验后,我发现树脂正在调用我的 AbstractAuthenticator 实现“身份验证”方法,该方法采用 HttpDigestCredentials 对象而不是 DigestCredentials (仍然不知道何时调用它们中的每一个)问题是 HttpDigestCredentials 没有有一个 getDigest() 方法,而是有一个 getResponse() 方法,该方法不返回哈希值或至少不返回可比较的哈希值。
创建我自己的 [[user:realmassword] [nonce] [method:uri]] 哈希后,哈希非常不同,实际上我认为 getResponse() 不会返回摘要,但可能是服务器对浏览器的响应?
无论如何,这是我的调试日志:
USER:user:PASSWORD:password:REALM:resin:METHOD:GET:URI/appe/appe.html:NONCE:HsJzN+j+GQD:CNONCE:b1ad4fa1ba857cac88c202e64528bc0c:CLIENTDIGEST:[B@5dcd8bf7:SERVERDIGEST:I4DkRCh21YG2Mk14iTe+hg==
如您所见,假定的客户端 nonce 与服务器生成的 nonce 非常不同,实际上客户端 nonce 看起来根本不像 MD5 哈希。
请问以前有人做过吗?HttpDigestCredentials 中是否缺少某些内容?我知道摘要几乎没有使用。
拜托,我知道 SSL,但我还没有 SSL 证书,所以不要告诉我“你为什么不使用 SSL”。;)
更新:
不确定这样做是否正确,但正如我之前读到的,Resin 使用 base64 格式的哈希值,所以我使用 apache commons-codec-1.6 来使用 encodeBase64String() 方法,现在哈希值看起来很相似,但它们不一样。
我都试过了passwordDigest.getPasswordDigest(a1+':'+nonce+':'+a2); passwordDigest.getPasswordDigest(a1+':'+nonce+':'+ncount+':'+cnonce+':'+qop+':'+a2);
并且它们都没有给出与 HttpDigestCredentials 中的哈希值相同的哈希值。