【问题标题】:Different encoding using "android.util.Base64" and "org.apache.commons.codec.binary.Base64;"使用“android.util.Base64”和“org.apache.commons.codec.binary.Base64;”的不同编码
【发布时间】:2012-10-09 21:10:50
【问题描述】:

我正在 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 时相同,那么问题不在于操作系统,我认为)。

【问题讨论】:

    标签: android encoding base64


    【解决方案1】:

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

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

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

    【讨论】:

    • 已经尝试了所有的变种:CRLF、NO_CLOSE、NO_PADDING、NO_WRAP、URL_SAFE...什么都没有...另一个有问题的字符串是 n2EaLpQr0uKgkZKhCQzwuIFeeLjzZKerZcETVNcfla4= n2EaLpQr0uKgkZKhCQzwuD9eeLjzZKerZc + 或 - ...不过谢谢
    • 字符串在 Base64 之前相等?
    • 是的...我查过了。我认为如果这些不等于生成的字符串将完全不同(因为 SHA256 算法)。
    • 使用 NO_WRAP 为我做到了!
    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    相关资源
    最近更新 更多