加密 / 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);
    }
相关推荐
赤壁小虾8 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
MC皮蛋侠客8 小时前
SQLAlchemy 系列(七):高级建模与高效写入——批量 DML、方言与扩展
数据库·python
奈斯先生Vector9 小时前
把 Midjourney 二次编辑做成生产系统:customId 能力令牌、Action Graph 与 WebUI 精修工作台
数据库·人工智能·架构·aigc·音视频·midjourney
Lethehong9 小时前
双擎并驱·全链路并行:KFS让TB级异构增量同步秒级到达
数据库
MC皮蛋侠客9 小时前
SQLAlchemy 系列(八):AsyncIO、并发与 Web 生命周期——让每个并发任务持有自己的 Session
数据库·python
一水10 小时前
Redis实战:一个AI工作流系统里的五个应用场景,从传参到限流的完整链路
数据库·redis·wpf
枫叶v.11 小时前
Prompt Injection 防不住怎么办?从 Source-Sink 模型设计 Agent 安全边界
数据库·安全·prompt
Lucky_Turtle11 小时前
【Milvus】向量数据库
数据库
吴声子夜歌11 小时前
MongoDB 8.0——安全性
数据库·mongodb
xcLeigh12 小时前
KingbaseES 的卢智能运维体架构深度拆解
运维·数据库·人工智能·ai·架构·ffmpeg·智能体