【问题标题】:Caucho Resin Digest Authentication with CustomAuthenticator, someone please enlighten meCaucho Resin Digest Authentication with Custom Authentication,有人请赐教
【发布时间】:2012-02-14 18:32:37
【问题描述】:

好的,经过一点实验,我发现resin调用了我的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 中的哈希值相同的哈希值。

【问题讨论】:

    标签: digest-authentication resin appserver


    【解决方案1】:

    好吧,我终于成功了。奇怪的主题哈,只有两种观点?

    首先,摘要式身份验证使用用户、密码、领域、nonce、client_nonce、nonce_count、method、qop 和 uri。基本上它使用完整的摘要规范。因此,为了计算哈希,必须用所有的口哨来计算它。只需为 HttpDigestCredentials 中的每个变量调用 get 方法,用户和密码除外。用户将以委托人的形式出现,密码您必须自己在数据库中查找(在我的情况下为 DB4O 数据库)。

    然后您必须创建一个 PasswordDigest 对象,该对象将负责使用 getPasswordDigest() 方法生成哈希,但首先必须使用 passwordDigestObject.setFormat("hex") 将格式设置为十六进制。

    HA1 有一个 getPasswordDigest(user,password,realm) 方法,还有另一个 getPasswordDigest() 方法,它只接受一个字符串,可以使用它来生成其余的哈希值,包括 HA2 和之前的哈希值HA1最后的hash,当然用nonce nonce_count client_nonce和qop,当然每一个用分号隔开。

    然后是棘手的部分,尽管当您从 HttpDigestCredentials 调用 getResponse() 方法时,resin 使用 base64 编码进行摘要,但它返回一个字节数组(这很奇怪),因此为了将它与您的哈希值进行比较,我做了什么使用 org.apache.commons.codec.binary.Hex 中的 Hex.encodeHexString() 方法并传递 HttpCredentialsDigest getResponse() 返回值,这将提供一个很好的十六进制字符串进行比较。

    我反其道而行之,我使用 PasswordDigest 中的 Base64 哈希并将 HttpDigestCredentials 哈希转换为 Base64,结果字符串永远不会相同。

    【讨论】:

      猜你喜欢
      • 2016-10-10
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 2016-11-10
      • 2015-12-31
      • 2019-10-30
      • 1970-01-01
      • 2011-03-10
      相关资源
      最近更新 更多