java md5签名首位为0时被忽略,导致接口验签失败(签名错误)

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;
	}

参考:https://blog.csdn.net/liaoxiaoyi121121/article/details/80408479?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control

猜你喜欢

转载自blog.csdn.net/qq_29025955/article/details/116696367
今日推荐