1

私は Android で認証サービスをプログラミングしていますが、これには Java で書かれたサーバー部分が含まれています。Android とサーバーで次の 2 つのコードを実行する両方の部分で同じ操作を行います。

アンドロイド:

String genChallengeResponse(String challenge, String message) {
  String Hmac_ALG = "HmacSHA256";
  SecretKey key = new SecretKeySpec(challenge.getBytes(), Hmac_ALG);
  Mac m = Mac.getInstance(Hmac_ALG);
  m.init(key);
  m.update(password.getBytes());
  byte[] mac = m.doFinal();
  return new String(Base64.encode(mac, Base64.DEFAULT));
}

サーバ:

String genChallengeResponse(String challenge, String message) {
  String Hmac_ALG = "HmacSHA256";
  SecretKey key = new SecretKeySpec(challenge.getBytes(), Hmac_ALG);
  Mac m = Mac.getInstance(Hmac_ALG);
  m.init(key);
  m.update(password.getBytes());
  byte[] mac = m.doFinal();
  return new String(Base64.encodeBase64(mac));
}

同じ課題とメッセージから始めて、結果は次のとおりです。

Android: n2EaLpQr0uKgkZKhCQzwuIFeeLjzZKerZcETVNcfla4=
サーバー: n2EaLpQr0uKgkZKhCQzwuD9eeLjzZKerZcETVNcfla4=
                              ^^

これらは 2 つの文字だけが異なります。問題は、この奇妙な動作が、関数に渡されるすべての文字列のペアに現れないことです...

各システムでUTF-8を使用しようとしましたが、何も変わりません...誰かが問題を知っていますか? これが既知の問題である場合...

(Android 2.2または4.0を使用しても問題は同じであると言うことが重要です。問題はオペレーティングシステムではないと思います)。

4

1 に答える 1

2

まだコメントできないため、回答として:

数週間前、Android の Base64 が Linefeeds に異なる設定を使用していることを知りました (ここを確認してください: http://developer.android.com/reference/android/util/Base64.html )

おそらく、他のオプションの1つ(NO_PADDINGまたはURLセーフ、テストされたパスワードには+または-が含まれていますか?)が結果を変える可能性があります...

于 2012-10-09T21:23:43.120 に答える