我正在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的问题是相同的,那么问题不在于操作系统,我认为)。
答案 0 :(得分:2)
因此无法发表评论作为答案:
我几周前发现,Android的Base64使用不同的Linefeeds设置(请点击此处:http://developer.android.com/reference/android/util/Base64.html)
我认为在我的情况下缺少NO_WRAP。或许其他选项之一(NO_PADDING或URL-Safe,测试的密码是否包含+或 - ?)可能会改变您的结果......