欢迎关注公众号:天天说编程 免费改简历,资料分享,面试经验分享。私信即可。
1、MD5加密简介
在用户注册是时候,通常使用MD5加密,先看下什么是MD5加密,以及加密过程?
MD5全名Message-Digest Algorithm 5(信息-摘要算法)是一种不可逆的加密算法。
2、MD5有以下特性:
压缩性:任意长度的数据,算出的MD5值长度都是固定的。
容易计算:从原数据计算出MD5值很容易。
抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
3、MD5加密有哪些问题?
用户注册的时候保存的是用户输入密码的散列值,而不是保存密码。
这样在用户登录的时候,将用户的密码使用散列算法计算一下散列值,和数据库注册的时候保存的散列值比较一下。如果相同就认为登录成功。
其实这样是不安全的,只要把经常出现的密码和对应的散列值保存起来,保存到数据库。只要拿到用户密码的散列值,只要用户的密码不是非常复杂的,就很有可能把散列值的原始密码找出来。这样黑客就会继续撞库。
此时我们可以使用加盐算法。
在用户注册的时候,生成一个随机的复杂字符串做为"盐",这个盐也保存在数据库里面。同时把用户输入的密码加上这个盐,再计算出散列值保存在数据库中。这样在用户登录的时候,只要把用户输入的密码和盐连接起来,计算出一个散列值,再和数据库中的散列值比较一下,就可以知道密码是不是正确的了。由于盐比较复杂,导致用户的密码和盐连接在一起的字符创更加复杂。这样计算出的散列值就很难反向推算出原始的密码了。即使用户密码很简单,黑客拿到了散列值,也无法破解密码。也没发去别的网站尝试撞库了 。
4、相关代码自测
public class MD5Utils {
public static String getMD5Str(String str) throws NoSuchAlgorithmException {
MessageDigest d = MessageDigest.getInstance("md5");
// 这儿采用的是加盐的方式
return Base64.getEncoder().encodeToString(d.digest((str + Constant.SALT).getBytes()));
}
public static void main(String[] args) throws NoSuchAlgorithmException {
String s = getMD5Str("123456");
System.out.println(s);
}
}
欢迎关注公众号:天天说编程 免费改简历,资料分享,面试经验分享。私信即可。