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);
    }
相关推荐
小糯米6018 小时前
JavaScript表达式与运算符
开发语言·javascript·ecmascript
北极星日淘8 小时前
煤炉自动代拍功能开发 | Python 异步任务实现批量下单
开发语言·python·自动化
体验家8 小时前
体验家 XMPlus 网页端问卷 SDK 技术解析:用几行 JavaScript 实现精准场景触发与防打扰机制
开发语言·前端·javascript
技术小结-李爽8 小时前
【工具】Maven的使用
java·maven
sou_time8 小时前
从 0 到 商用:AI Agent x SKILL x MCP 全栈实战教程:L2 高等篇:MCP 协议 + Spring AI + Agent 编排
java·人工智能·spring
二十七剑8 小时前
LangGraph 源码深度解析:Node 节点 Protocol 与 StateNodeSpec 核心机制
开发语言·python
AC赳赳老秦9 小时前
OpenClaw + 云数据库运维:自动备份、扩容、迁移 RDS/MySQL 云数据库
运维·开发语言·数据库·人工智能·python·mysql·openclaw
醉城夜风~9 小时前
类和对象III
开发语言·c++
冷小鱼9 小时前
高级研发编码习惯:从规范到艺术,再到AI+时代的人机协同
java·开发语言·python·编码习惯
齐 飞9 小时前
JDK21虚拟线程
java·后端