Web サーバーに symfony2 を使用し、x-wsse ヘッダーで wsse 認証を使用します。
実際の問題は、PHP と同じ結果を得るために Java で正確にどの関数を使用すればよいかということです。
ヘッダー生成用の PHP 部分:
$nonce = substr( md5( uniqid( 'nonce_', true ) ), 0, 16 );
$nonceHigh = base64_encode( $nonce );
$passwordDigest = base64_encode( sha1( $nonce . $created . $password . "{" . $user->getSalt() . "}", true ) );
$header = "UsernameToken Username=\"{$username}\", PasswordDigest=\"{$passwordDigest}\", Nonce=\"{$nonceHigh}\", Created=\"{$created}\"";
ヘッダー検証用の PHP 部分:
$expected = base64_encode( sha1( base64_decode( $nonce ) . $created . $secret, true ) );
nonce の代わりにnonceHighを直接使用する理由がわかりません。これがJavaの問題の原因だと思います。また、ノンスを生成するか、サーバーから生成されたものを使用する必要があるかどうかもわかりません。比較を行うために、サーバーからのナンスを再利用してダイジェストを生成しました。
byte [] nonceLow = Base64.decode(nonceHigh, Base64.DEFAULT); // nonceHigh is from above
String nonce = String.valueOf(nonceLow); // this give strange result. is it wrong?
String temp = nonce + format(now) + password;
try {
MessageDigest md = MessageDigest.getInstance("SHA1");
//new String(Base64.encodeBase64(md.digest(temp.getBytes())));
digest = Base64.encodeToString(md.digest(temp.getBytes("UTF-8")), Base64.DEFAULT);
} catch (Exception e) {
throw new AuthenticationException(e.getMessage(), e);
}
String wsse =
"UsernameToken Username=\"" + username
+ "\", "
+ "PasswordDigest=\""
+ digest
+ "\", "
+ "Nonce=\""
+ nonceHIGH
+ "\", "
+ "Created=\""
+ format(now)
+ "\"";
質問は:
- PHPがnonceの代わりにnonceHightを使用するのはなぜですか?
- アンドロイド Java
Base64.encodeToString() == php base64_encode()
? - アンドロイド Java
Base64.decode() == php base64_decode()
?