首先 可以去看这篇文章 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单向摘要是容易被别人暴力破解的,一般当后台接收到用户的密码后,需要在原始字符串前后拼接上一段子串,然后再去计算摘要值。