首先 可以去看这篇文章
Java md5加密 - 酷盖的小机灵 - 博客园
MessageDigest(加密)_禅悟刂的博客-CSDN博客_messagedigest
在实际开发中,需要将用户的密码这种敏感字段加密后存储到数据库中,千万不可以用明文存储。
加密原理
为了保证传输内容的正确性,需要对传输的内容生成摘要,如果内容被修改了,那么生成的摘要就不会一致,这就是我们要实现的封装类的原理。用户注册时,将用户密码利用摘要、加密算法处理后生成的无规则字符串存储到库中,用户登录时,对接收到的密码用同样的算法生成摘要,与库中存储的密串进行对比,即可。
经典的摘要算法有MD5、SHA-1等。
封装工具类
MD5的加密方式是一个比较经典的加密方式,
在一些框架中,都提供了一些MD5加密的方式。
JDK中提供了MD5加密的方法,在没有框架时,可以自己封装一个MD5工具类来实现MD5加密。
MD5原理是一个单向的哈希函数,他可以接收任意长度大小的数据,输出固定长度的哈希值。
MD5算法得到一个固定的128bit的二进制串,为了更好的表示,一般会将这个二进制串转换为16进制。
首先你需要知道JDK中提供的一个类MessageDigest,这个类是JDK提供的一个加密算法的引擎类,在实例化时,指定一种加密、摘要算法,就可以得到一个具有加密、摘要的功能的实例对象
public static String getMD5Str(String str) {
byte[] digest = null;
try {
// 获取一个指定算法的摘要对象
MessageDigest md5 = MessageDigest.getInstance("md5");
// 需要传入一个字节数组并返回一个摘要生成后的字节数组
// 利用digest传入字节数组生成最终的摘要
digest = md5.digest(str.getBytes("utf-8"));
} catch (Exception e) {
e.printStackTrace();
}
//16是表示转换为16进制数
// 将字节数组转换为16进制
String md5Str = new BigInteger(1, digest).toString(16);
return md5Str;
}
public static void main(String[] args) {
String str = getMD5Str("lmk");
System.out.println(str);
}
或者
public static String getMD5(String str){
byte[] bytes = null;
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
// 利用update方法将待摘要文本放入
md5.update(str.getBytes("utf-8"));
// 利用digest方法生成
bytes = md5.digest();
} catch (Exception e) {
e.printStackTrace();
}
return new BigInteger(bytes).toString(16);
}
完善
直接利用这样的MD5单向摘要是容易被别人暴力破解的,一般当后台接收到用户的密码后,需要在原始字符串前后拼接上一段子串,然后再去计算摘要值。