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);
    }
相关推荐
码农小河668 分钟前
基于PHP的电商后台蜜罐系统
开发语言·php
starzy199017 分钟前
深入理解Scala柯里化函数:函数链式变换
开发语言·scala
ShineWinsu1 小时前
对于Qt:QTreeWidget常见属性以及QTreeWidgetItem类的解析
开发语言·c++·qt·gui·客户端·多叉树·qtreewidget
落羽的落羽1 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
考虑考虑1 小时前
JDK27中的Set.ofLazy
java·后端·java ee
文丑颜不良啊1 小时前
LeetCode2841~2860题目解析
java·leetcode
小南家的青蛙1 小时前
Tomcat与Jetty深度对比
java·tomcat·jetty
总要学点什么2 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
乌暮3 小时前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
YDS8293 小时前
Small Spring IOC篇:容器事件及其监听器
java·spring