目录
- 1. 加密的引出
- 2. MD5介绍
- 3. 解决MD5不可解密方法
- 4. 实现加密解密
- 4.1 加密
- 4.2 验证密码
1. 加密的引出
在MySQL数据库中,一般都需要把密码、身份证、电话号码等信息进行加密,以确保数据的安全性。如果使用明文来存储,当数据库被入侵的时候,那么用户的这些重要信息就会泄露,从而造成很大的损失。
2. MD5介绍
- 密码算法主要分为三类:对称密码、非对称密码和摘要算法。而MD5是常见的摘要算法之一。
- 摘要算法:是把任意长度的输入信息数据转化为固定长度的输出数据的一种密码算法,是不可逆的,即不可解密的。
3. 解决MD5不可解密方法
-
采用一个密码拼接一个随机字符来进行加密,这个随机字符就称之为 盐。
-
而盐值通过UUID.randomUUID()方法来生成。
-
加密算法:
-
数据库中存储的信息是:盐值+密文,即盐值+md5(明文+盐值)。
-
md5(明文+盐值)加密:
- 解密流程:由于MD5不可逆,所以通常采用判断哈希值是否一致来判断密码是否相等。如果用户输入的的密码 加盐之后进行md5加密,即md5(用户输入的密码+盐值)+ 盐值 和 存储在数据库的密文是否相等。
4. 实现加密解密
4.1 加密
/**
* 加密
* password : 用户注册时输入的密码
* @return :数据库存储的信息: 盐值 + md5(明文+盐值)
*/
public static String encrypt(String password) {
// 生成盐值
String salt = UUID.randomUUID().toString().replace("-", "");
// 对明文+盐值 进行MD5加密
String finalPassword = DigestUtils.md5DigestAsHex((password + salt).getBytes());
// 存储在数据库的信息
return salt+finalPassword;
}
4.2 验证密码
/**
* 验证密码是否正确
* @param inputPassword 用户登录输入的密码
* @param sqlPassword 数据库中password字段存储的信息 盐值 + md5(明文+盐值)
* @return
*/
public static boolean varify(String inputPassword,String sqlPassword) {
if (!StringUtils.hasLength(inputPassword)) {
return false;
}
if (sqlPassword == null || sqlPassword.length()!=64) {
return false;
}
// 获取盐值
String salt = sqlPassword.substring(0,32);
// 根据用户输入的密码和盐值,进行加密 md5(明文+盐值)
String finalPassword = DigestUtils.md5DigestAsHex((inputPassword + salt).getBytes());
return (salt+finalPassword).equals(sqlPassword);
}