加密 / MD5算法 /盐值

目录

加密的介绍

MD5算法

盐值


加密的介绍

加密介绍:在MySQL数据库中, 我们常常需要对密码, 身份证号, 手机号等敏感信息进行加密, 以保证数据的安全性。 如果使用明文存储, 当黑客入侵了数据库时, 就可以轻松获取到用户的相关信息, 从而对用户或者企业造成信息泄漏或者财产损失。

加密算法:对称加密、非对称加密、摘要算法。

  1. 对称密码算法:是指加密秘钥和解密秘钥相同的密码算法

  2. 非对称密码算法 是指加密秘钥和解密秘钥不同的密码算法. 该算法使用一个秘钥进行加密, 用另外一 个秘钥进行解密。

摘要算法:把一个不固定长度的字符串,通过一定的算法,变成固定长度的字符串。(不可逆的,无法解密)

MD5算法

MD5算法就是摘要算法的一种

缺陷:虽然经过MD5加密后的密文无法解密, 但由于相同的密码经过MD5哈希之后的密文是相同的, 当密码位数简单时,黑客可以事先建立好对应的数据库进行比对,从而破解密码。

盐值

解决方案: 采用为一个密码拼接一个随机字符来进行加密, 这个随机字符我们称之为"盐". 假如有⼀个加盐后的加密串,黑客通过一定手段对这个加密串, 他拿到的明文并不是我们加密前的字符串, 而是加密前的字符串和盐组合的字符串, 这样就增加了字符串的安全性。

实现加密

1.存储随机盐值

2.存储加密后的密文

3.加密算法(MD5)

写加密/解密工具类

java 复制代码
public class SecurityUtils {
    /**
     * 加密
     * @param password  明文密码
     * @return  盐值+密文
     */
    public static String encrypt(String password){
        //生成随机盐值
        String salt = UUID.randomUUID().toString().replace("-","");
        System.out.println(salt);
        //加密  盐值+明文
        String securityPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());
        //数据库中存储   盐值+密文
        return salt+securityPassword;
    }

    /**
     * 校验
     * @return
     */
    public static boolean verify(String inputPassword, String sqlPassword){
        //取出盐值
        if (sqlPassword ==null || sqlPassword.length()!=64){
            return false;
        }
        String salt = sqlPassword.substring(0,32);
        //得到密文
        String securityPassword = DigestUtils.md5DigestAsHex((salt+inputPassword).getBytes());
        return (salt+securityPassword).equals(sqlPassword);
    }
    public static void main(String[] args) {
        String finalPassword = encrypt("123456");
        System.out.println(finalPassword);
        System.out.println(verify("123456",finalPassword));
    }
}

修改一下数据库密码,使用测试类给密码123456(假设我们的数据库密码为123456)生成密文:

随机盐值:

有分割杠,容易被黑客识别,去掉中间的分割杠。由于去掉后本就分不清密文和随机盐值,再加上存储的顺序可以是千变万化的,更加不容易破解密码。

修改数据库明文密码为密文, 执行SQL:

sql 复制代码
update user set password='';
//数据库 password修改成生成的密文

登录接口:

sql 复制代码
 @RequestMapping("/login")
    public Result login(String userName, String password){
        //1.参数校验
        //2.密码校验
        //3.生成token并返回
        if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){
            return Result.fail("用户名或密码为空");
        }
        //获取数据库中的密码
        UserInfo userInfo=userService.queryByName(userName);
        if(userInfo==null ||userInfo.getId()<0){
            return Result.fail("用户不存在");
        }


        //校验密码
        if (!SecurityUtils.verify(password, userInfo.getPassword())){
            return Result.fail("密码错误!");
        }



        //生成token并返回
        Map<String,Object> claim=new HashMap<>();
        claim.put("id",userInfo.getId());
        claim.put("name",userInfo.getUserName());
        String token= JwtUtils.genToken(claim);
        return Result.success(token);
    }
相关推荐
CJi0NG38 分钟前
【自用】MySQL-多表查询
数据库·mysql
雨落在了我的手上44 分钟前
MySQL数据库基础(12):事务
数据库·mysql
D姐聊门店1 小时前
门店收银系统断网兜底怎么设计:本地账本、离线续传与日终对账的工程实现
数据库·saas
用户8662978480081 小时前
抓包看 KingbaseES 内部协议?官方给了个现成工具
数据库
wefg11 小时前
【Redis】安装与启动
数据库·redis·缓存
大圣编蚕2 小时前
常见的 Redis 面试题(高频整理)
数据库·redis·缓存
派小心.2 小时前
网站统计采样数据的误差核对
大数据·服务器·前端·数据库·人工智能·小程序·数据分析
龙腾AI白云2 小时前
数字孪生、具身智能、世界模型三者交叉
数据库·人工智能·机器学习·flask·pygame
SelectDB技术团队3 小时前
Apache Doris 基于 Lance 的向量检索深度解析
数据库·数据仓库·数据分析·湖仓一体·apache doris·lakehouse·多模湖仓
这个DBA有点耶3 小时前
从INDEX到JOIN_ORDER:MySQL 8.0 Hint语法体系与五类实战场景
数据库·mysql·架构