好的,在做了一些实验之后,我发现resin调用了我的AbstractAuthenticator实现的"authenticate“方法,该方法接受一个HttpDigestCredentials对象,而不是DigestCredentials (仍然不知道什么时候会调用它们中的每一个)。问题是HttpDigestCredentials没有getDigest()方法,相反,它有一个getResponse()方法,它不返回散列,或者至少不返回可比较的散列。
在创建我自己的[user:realmassword方法: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==正如您所看到的,假设的客户端现时值与服务器生成的现时值非常不同,实际上客户端现时值看起来根本不像MD5散列。
以前有没有人这样做过?HttpDigestCredentials中是否缺少某些内容?我知道digest很少使用。
请,我知道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相同的哈希值。
发布于 2012-02-17 02:55:33
好了,我终于成功了。奇怪的主题哈,只有两个视图?
首先,摘要式身份验证使用用户、密码、域、随机数、client_nonce、nonce_count、方法、qop和uri。基本上,它使用完整的摘要规范。因此,为了计算散列,必须用所有的口哨来计算它。只需为HttpDigestCredentials中除user和password之外的每个变量调用get方法即可。用户将以主体和密码的形式出现,您必须自己在DB (在我的例子中是DB4O数据库)中查找它。
然后,您必须创建一个PasswordDigest对象,该对象负责使用getPasswordDigest()方法生成散列,但首先必须使用passwordDigestObject.setFormat(“十六进制”)将格式设置为十六进制。
有一个用于HA1 getPasswordDigest(用户,密码,领域)的方法,还有另一个getPasswordDigest()方法,它只接受一个字符串,可以用它来生成其余的散列,包括HA2和之前的散列HA1最终的散列,当然还有现时值nonce_count client_nonce和qop,当然每个散列都用分号分隔。
接下来就是棘手的部分了,虽然resin使用base64编码进行摘要,但当你从HttpDigestCredentials调用getResponse()方法时,它会返回一个字节数组(这很奇怪),所以为了与你的散列进行比较,我使用了org.apache.commons.codec.binary.Hex的Hex.encodeHexString()方法,并传递了HttpCredentialsDigest getResponse()返回值,这将给出一个很好的十六进制字符串进行比较。
相反,我使用的是来自PasswordDigest的Base64散列,并将HttpDigestCredentials散列转换为Base64,结果字符串永远不会相同。
https://stackoverflow.com/questions/9282257
复制相似问题