1

我正在 Android 中编写一个身份验证服务,这个服务包括一个用 java 编写的服务器部分。我在 Android 和 Server 中执行这两条代码的两个部分都执行相同的操作:

安卓:

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));
}

从相同的挑战和消息开始,结果如下:

安卓:n2EaLpQr0uKgkZKhCQzwuIFeeLjzZKerZcETVNcfla4=
服务器:n2EaLpQr0uKgkZKhCQzwuD9eeLjzZKerZcETVNcfla4=
                              ^^

这些仅针对两个字符而有所不同。问题是这种奇怪的行为并没有出现在传递给函数的每一对字符串中......

我尝试在每个系统中使用 UTF-8,但没有任何变化……有人知道问题出在哪里吗?如果这是一个已知问题...

(重要的是,使用 Android 2.2 或 4.0 时问题是一样的,那么问题不在于操作系统,我认为)。

4

1 回答 1

2

因此无法发表评论作为答案:

几周前我发现 Android 的 Base64 对 Linefeeds 使用不同的设置(在这里查看:http: //developer.android.com/reference/android/util/Base64.html

我认为在我的情况下它缺少 NO_WRAP。也许其他选项之一(NO_PADDING 或 URL 安全,测试的密码是否包含 + 或 - ?)可能会改变你的结果......

于 2012-10-09T21:23:43.120 回答