数据库中敏感信息的加密方法
数据库中通常保存着用户的敏感信息,例如账户密码,身份证号,手机号等。如果被黑客入侵,就会造成用户信息泄露的严重后果。因此为了保护用户信息,需要对敏感信息加密,以保证数据的安全性。提示:以下是本篇文章正文内容,下面案例可供参考虽然用户的敏感信息(如密码),可能是个简单的数字(如123456),但是黑客攻破数据库拿到的信息是一个 盐值 + 密文 组合的字符串,黑客并不知道我们的加密方式,因此不能破解得
文章目录
前言
数据库中通常保存着用户的敏感信息,例如账户密码,身份证号,手机号等。如果被黑客入侵,就会造成用户信息泄露的严重后果。因此为了保护用户信息,需要对敏感信息加密,以保证数据的安全性。
提示:以下是本篇文章正文内容,下面案例可供参考
一、加密算法的分类
加密算法主要分为3类:对称加密算法,非对称加密算法和摘要算法。
- 对称加密算法:指加密密钥和解密密钥相同的算法,常见的有AES,DES,RC4等;
- 非对称加密算法:使用一对非对称密钥,使用公钥加密,需要使用私钥解密,使用私钥加密,需要使用公钥解密的算法,常见的有RSA,DSA等;
- 摘要算法:把任意长度的输入消息数据转化为固定长度的输出数据的算法,摘要算法是不可逆的,因此无法解密,常见的有MD5,SHA,CRC等;
二、加密思路
以MD5算法为例:
1.引入盐值,进行加密
明文:用户给定的敏感信息,如密码;
盐值:一个随机生成的字符串;
明文 + 盐值:加密前的组合;
MD5(明文 + 盐值):使用MD5加密算法,对(明文 + 盐值)进行MD5加密,得到密文;
数据库存储:后续解密会用到盐值,因此将 盐值 + 密文 存储到数据库中。
2.解密
明文:用户输入的敏感信息,如密码
获取盐值:从数据库获取密文,并根据加密的思路,获取盐值;
明文+ 盐值 :加密前的组合;
MD5(盐值 + 明文):使用MD5加密算法,对(明文 + 盐值)进行MD5加密,得到密文;
密文 + 盐值:和数据库中存储的信息进行对比,如果相同,表示用户输入密码是正确的,不同表示输入密码错误。
3.总结
虽然用户的敏感信息(如密码),可能是个简单的数字(如123456),但是黑客攻破数据库拿到的信息是一个 盐值 + 密文 组合的字符串,黑客并不知道我们的加密方式,因此不能破解得到用户的敏感信息,起到了保护用户敏感信息的作用。
三、代码演示实现方法
数据库信息:

加密方法与解密方法:
public class SecurityUtils {
/**
* 加密
*/
public static String encrypt(String password){
// 生成随机盐值
String salt = UUID.randomUUID().toString().replace("-", "");
// 对 明文 + 盐值 进行 MD5 加密 => MD5(明文 + 盐值)
String finalPassword = DigestUtils.md5DigestAsHex((password + salt).getBytes());
return salt + finalPassword;
}
/**
* 解密
*/
public static Boolean verify(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 calcPassword = DigestUtils.md5DigestAsHex((inputPassword + salt).getBytes());
if(!sqlPassword.equals(salt + calcPassword)){
return false;
}
return true;
}
}
登录接口:
@RequestMapping("/login")
public Result<String> login(String userName, String password){
log.info("/user/login: userName: {}, password: {}", userName, password);
// 1. 校验参数是否为空
if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){
return Result.fail("用户名或密码为空");
}
// 2. 校验用户是否存在
UserInfo userInfo = userInfoService.selectByName(userName);
if(userInfo == null){
return Result.fail("用户不存在");
}
// 3. 校验密码是否正确
String sqlPassword = userInfo.getPassword();
if(!SecurityUtils.verify(password, sqlPassword)){
log.error("/user/login, 密码错误");
return Result.fail("密码错误");
}
// 4. 校验成功,发方令牌
userInfo.setPassword("");
Map<String, Object> claim = new HashMap<>();
claim.put(Constants.USER_ID, userInfo.getId());
claim.put(Constants.USER_NAME, userInfo.getUserName());
String token = JwtUtils.genJwtToken(claim);
return Result.success(token);
}
输入用户名(zhangsan)和密码(123456),进行登录,登录成功:

总结
本文使用 MD5 加密算法介绍了对数据库中用户敏感数据加密的思路和实现方式。
更多推荐




所有评论(0)