使用“android.util.Base64”和“org.apache.commons.codec.binary.Base64;”进行不同的编码

时间:2012-10-09 21:10:51

标签: android encoding base64

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

ANDROID:

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

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.encodeBase64(mac));
}

从相同的挑战和信息开始,这些是结果:

Android: n2EaLpQr0uKgkZKhCQzwuIFeeLjzZKerZcETVNcfla4=
Server:  n2EaLpQr0uKgkZKhCQzwuD9eeLjzZKerZcETVNcfla4=
                              ^^

这些仅适用于两个字符。 问题是这个奇怪的行为不会出现在传递给函数的每一对String中......

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

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

1 个答案:

答案 0 :(得分:2)

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

我几周前发现,Android的Base64使用不同的Linefeeds设置(请点击此处:http://developer.android.com/reference/android/util/Base64.html

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