Java -- 实现MD5加密/加盐

目录

  • [1. 加密的引出](#1. 加密的引出)
  • [2. MD5介绍](#2. MD5介绍)
  • [3. 解决MD5不可解密方法](#3. 解决MD5不可解密方法)
  • [4. 实现加密解密](#4. 实现加密解密)
    • [4.1 加密](#4.1 加密)
    • [4.2 验证密码](#4.2 验证密码)

1. 加密的引出

在MySQL数据库中,一般都需要把密码、身份证、电话号码等信息进行加密,以确保数据的安全性。如果使用明文来存储,当数据库被入侵的时候,那么用户的这些重要信息就会泄露,从而造成很大的损失。

2. MD5介绍

  • 密码算法主要分为三类:对称密码、非对称密码和摘要算法。而MD5是常见的摘要算法之一。
  • 摘要算法:是把任意长度的输入信息数据转化为固定长度的输出数据的一种密码算法,是不可逆的,即不可解密的

3. 解决MD5不可解密方法

  • 采用一个密码拼接一个随机字符来进行加密,这个随机字符就称之为 盐

  • 而盐值通过UUID.randomUUID()方法 来生成。

  • 加密算法:

  • 数据库中存储的信息是:盐值+密文,即盐值+md5(明文+盐值)

  • md5(明文+盐值)加密:

  • 解密流程:由于MD5不可逆,所以通常采用判断哈希值是否一致来判断密码是否相等。如果用户输入的的密码 加盐之后进行md5加密,即md5(用户输入的密码+盐值)+ 盐值 和 存储在数据库的密文是否相等。

4. 实现加密解密

4.1 加密

复制代码
/**
 *  加密
 * password : 用户注册时输入的密码
 * @return :数据库存储的信息: 盐值 + md5(明文+盐值)
 */
java 复制代码
    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
 */
java 复制代码
    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);
    }
相关推荐
WMSmile7 分钟前
Maven下载aspose依赖失败的解决方法
java·maven
Python私教9 分钟前
Rust:安全与性能兼得的现代系统编程语言
java·安全·rust
2401_8979300613 分钟前
Maven 使用教程
java·maven
前端.火鸡14 分钟前
使用wavesurferJs实现录音音波效果
开发语言·前端·javascript
PXM的算法星球24 分钟前
【Java后端】MyBatis 与 MyBatis-Plus 如何防止 SQL 注入?从原理到实战
java·sql·mybatis
zh_xuan28 分钟前
java Optional
java·开发语言
盐烟35 分钟前
C语言-函数练习1
c语言·开发语言·笔记
阿杜杜不是阿木木36 分钟前
03.使用spring-ai玩转MCP
java·人工智能·spring boot·spring·mcp·spring-ai
旧故新长39 分钟前
MyBatis 类型处理器(TypeHandler)注册与映射机制:JsonListTypeHandler和JsonListTypeHandler注册时机
java·开发语言·mybatis
异常君1 小时前
Redis 中的概率过滤器:布隆过滤器与布谷鸟过滤器实战对比
java·redis·后端