0

少し実験した後、レジンがDigestCredentialsの代わりにHttpDigestCredentialsオブジェクトを受け取るAbstractAuthenticator実装の「認証」メソッドを呼び出していることがわかりました(それぞれがいつ呼び出されるかはまだわかりません)問題は、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==

両方の想定されるクライアントナンスがサーバーで生成されたナンスとは非常に異なることがわかるように、実際、クライアントナンスは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からのものと同じハッシュを与えません。

4

1 に答える 1

0

わかりました、やっとできました。奇妙な主題 え、2 つのビューだけですか?

まず、ダイジェスト認証では、user、password、realm、nonce、client_nonce、nonce_count、method、qop、および uri が使用されます。基本的にフルダイジェスト仕様です。したがって、ハッシュを計算するには、すべてのホイッスルを使用して計算する必要があります。ユーザーとパスワードを除く、HttpDigestCredentials の各変数に対して get メソッドを呼び出すだけです。ユーザーは、DB (私の場合は DB4O データベース) で自分で探す必要があるプリンシパルとパスワードの形式で提供されます。

次に、getPasswordDigest() メソッドでハッシュを生成することを処理する PasswordDigest オブジェクトを作成する必要がありますが、最初に passwordDigestObject.setFormat("hex") でフォーマットを 16 進数に設定する必要があります。

HA1 getPasswordDigest(user,password,realm) 用に 1 つあり、文字列を 1 つだけ受け取る別の getPasswordDigest() メソッドがあり、それを使用して残りのハッシュ (HA2 と以前にハッシュされた HA1 の両方) を生成できます。ハッシュ、もちろん nonce nonce_count client_nonce と qop を使用し、もちろんそれぞれをセミコロンで区切っています。

それからトリッキーな部分になりますが、レジンは HttpDigestCredentials から getResponse() メソッドを呼び出すとダイジェストの base64 エンコーディングで動作しますが、バイト配列を返します (これは奇妙です)。 org.apache.commons.codec.binary.Hex から Hex.encodeHexString() メソッドを呼び出して HttpCredentialsDigest getResponse() 戻り値を渡すと、比較する素敵な 16 進文字列が得られます。

私はそれを逆に行っていました.PasswordDigestのBase64ハッシュを使用し、HttpDigestCredentialsハッシュをBase64に変換しましたが、結果の文字列は決して同じではありませんでした.

于 2012-02-16T18:55:32.720 に答える