废话背景:
跟别人集成免密登录,用到了MD5加密,做好的数据偶尔行,偶尔不行,深刻怀疑别人代码有问题。(从不怀疑自己),理直气壮的找了别个对接人好几次。最后发现自己做的MD5位数不对,丢了数据。(尴尬啊,只好悄悄的说可以了,不解释,不道歉)
正文:
自己写的MD5加密,网上找到copy来的。
/**
* md5加密,返回32位小写的结果
* @param data 需要加密的数据
* @return 32位小写的结果
*/
public static String encrypt(String data) throws NoSuchAlgorithmException {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
StringBuilder result = new StringBuilder(32);
byte[] digest = messageDigest.digest(data.getBytes());
for (byte b : digest) {
result.append(Integer.toHexString(b & 0xff));
}
return result.toString();
}
加密内容,拼的时间戳和UUID,非常容易复现丢失精度的数据。
正确的md5用法
import org.apache.commons.codec.digest.DigestUtils;
DigestUtils.md5Hex(md5String);
没错,用现成的,舒服。也可以用hutool的工具类来做,也舒服。
问题分析:
主要问题是这里不对
for (byte b : digest) {
result.append(Integer.toHexString(b & 0xff));
}
可以使用
return Hex.encodeHexString(digest);
来替换这个for循环,就能解决问题了。