java md5签名首位为0时被忽略,导致接口验签失败(签名错误)
描述
最近在一项目中需要使用md5加密生成签名信息,将签名信息随着请求一起发送给接口服务端,接口服务端对签名信息进行验证。
在请求接口时发生了由服务端返回的一个错误:签名错误!
并且该错误发生的时机以及位置每次都不一样,也就是说随机时间发生
原因及解决
见以下代码及注释说明
注释的代码就是导致问题的原因
private String generateSignatureInfo(String checkNo,String timestamp) throws NoSuchAlgorithmException {
String appkey = "aaa";
String appSecret = "bbb";
String info = checkNo +appkey + appSecret + timestamp;
MessageDigest mdEnc = MessageDigest.getInstance("MD5"); // 使用md5签名算法
mdEnc.update(info.getBytes(), 0, info.length());
// 在mdEnc.digest()的首位刚好等于0的时候,使用new BigInteger(1,mdEnc.digest())会导致0被省略,以致生成的签名信息错误, 这是个坑!!(所以不用这种方式)
// String sign = new BigInteger(1,mdEnc.digest()).toString(16); // 生成签名信息
/*
* 使用以下方式生成签名信息:
* 将每一个字节取出来,单独转成十六进制
*/
byte[] bytes = mdEnc.digest();
Formatter formatter = new Formatter();
for (byte b : bytes) {
formatter.format("%02x", b);
}
String sign = formatter.toString();
formatter.close();
return sign;
}