MD5 加密
签名串格式::MD5(key1=value1&key2=value2&。。。&key=密钥)
这样需要在多个对象与值之后还需要添加key 密钥
1.一般需要加密出来的值选32位小写
2.加密的串key1 key2的排序有时候可能是规定按照首字母的顺序进行排序
import java.security.MessageDigest;
public static String MD5(String data) throws Exception { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] array = md.digest(data.getBytes("UTF-8")); StringBuilder sb = new StringBuilder(); for (byte item : array) { sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); } return sb.toString().toUpperCase(); }
Integer是4 字节 32位
Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3) 就是转化为32位
Integer.toHexString要求入参为int基本类型
(byte & 0xFF) | 0x100会计算得出一个byte,之后byte转int,正数会高24位补0,负数会高24位补1,接着截取字符串
**byte & 0xFF ** java中byte转int采取的补符号位扩展,这一段的作用是补零扩展。因为补符号位扩展的结果是十进制不变,原二进制改变。补零扩展为十进制改变,但是二进制不变。这里关心的并不是扩展后十进制是否相同,而是关心的二进制是否相同。
(byte & 0xFF)的目的是高24位取0,低8位比如是0111 1111,再或上0x100(二进制为1 1111 1111),结果为1 0111 1111,相当于保证了计算结果的16进制的字符长度大于3
str =str.subString(1,3)意思是截取字符串str,从第1个开始到第3个字符结束(不包括第3个字符)