【发布时间】:2014-11-19 15:06:27
【问题描述】:
我正在尝试将 nsstring(密码)转换为 MD5 和 base64。对于 Ascii 字符,一切正常,但是当我尝试测试“£”或“?”时签名,MD5 给了我一些垃圾值。我的服务器端失败了。
NSData *pwdData = [password dataUsingEncoding:NSUTF16StringEncoding allowLossyConversion:YES];
unsigned char result[CC_MD5_DIGEST_LENGTH];
CC_MD5(pwdData.bytes, pwdData.len, result);
[Base64 initialize];
[Base64 encode:result length:CC_MD5_DIGEST_LENGTH];
但同样的事情在 Android 中也能正常工作。
MessageDigest msgDigest = java.security.MessageDigest.getInstance("MD5");
msgDigest.update(s.getBytes("US-ASCII"));
byte bytes[] = msgDigest.digest();
return android.util.Base64.encodeToString(bytes, Base64.NO_WRAP);
我不确定是 MD5 还是 BASE64 有问题?当 Android 做同样的事情并且它工作正常时。
【问题讨论】:
-
我不是 Java 专家,但我会将
s.getBytes("US-ASCII")解释为 “转换为 7/8 位 ASCII”。然后你第二次用s.getBytes()更新摘要?我想这次它会使用 Java 的 UTF-16(LE 还是 BE?)编码?所以恕我直言,Android代码没有多大意义。另请注意,井号不是 ASCII 的一部分。 -
至少iOS和Android代码不会在同一个字节数组上计算MD5,这是肯定的!
-
为什么你认为 CC_MD5 会给你垃圾值?
-
抱歉,您希望字符串使用哪种字节编码? ASCII 还是 UTF-16?
-
另外,请注意,如果 Java 丢弃或转换字符,而服务器也这样做,这意味着任何带有特殊字符的密码都将处于危险之中!您几乎肯定想改用 UTF-8!
标签: android ios objective-c