先来看看这段代码:
/**
* 计算签名 * * content * */ 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字符集吧,转字节数组就乱了,后面就都白忙活了。