文章目录


前言

数据库中通常保存着用户的敏感信息,例如账户密码,身份证号,手机号等。如果被黑客入侵,就会造成用户信息泄露的严重后果。因此为了保护用户信息,需要对敏感信息加密,以保证数据的安全性。


提示:以下是本篇文章正文内容,下面案例可供参考

一、加密算法的分类

加密算法主要分为3类:对称加密算法,非对称加密算法和摘要算法。

  1. 对称加密算法:指加密密钥和解密密钥相同的算法,常见的有AES,DES,RC4等;
  2. 非对称加密算法:使用一对非对称密钥,使用公钥加密,需要使用私钥解密,使用私钥加密,需要使用公钥解密的算法,常见的有RSA,DSA等;
  3. 摘要算法:把任意长度的输入消息数据转化为固定长度的输出数据的算法,摘要算法是不可逆的,因此无法解密,常见的有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 加密算法介绍了对数据库中用户敏感数据加密的思路和实现方式。

Logo

一站式 AI 云服务平台

更多推荐