先来看看这段代码:
/**
* 计算签名
*
* @param content
* @return
*/
public static String sign(String content, String charset) {
if (charset == null || "".equals(charset)) {
charset = DEFAULTCHARSET;
}
String sign = "";
try {
content = new String(content.getBytes(), charset);
MessageDigest md5 = MessageDigest.getInstance("MD5");
sign = BASE64Encoder.encode(md5.digest(content.getBytes(charset)));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sign;
}
得到待转换内容的字节,按照要求的字符集转换,利用MD5加密,并进行BASE64编码,通用的做法,表面上看并无问题。
结果就出现在字节转换上面.......
我本地访问该方法得到的签名和通过服务(HTTP)访问得到签名居然不一致,用英文试试,没问题......
将待转换内容字节输出,比较看了一下,不一致
修改代码:
public static String sign(String content, Charset charset) {
if (charset == null || "".equals(charset)) {
charset = DEFAULTCHARSET;
}
String sign = "";
try {
byte[] contentByte = new byte[1024];
contentByte = content.getBytes(charset);
MessageDigest md5 = MessageDigest.getInstance("MD5");
sign = BASE64Encoder.encode(md5.digest(contentByte));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sign;
}
解决了。
问题总结:在获取参数内容后,转换字节数组居然没带参数,取默认参数的话,本地运行取的是应用字符集,如果http访问的话,我猜应该是浏览器或ISO8859-1字符集吧,转字节数组就乱了,后面就都白忙活了。