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);
    }
相关推荐
Dola_Pan3 分钟前
C语言:数组转换指针的时机
c语言·开发语言·算法
ExiFengs3 分钟前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring
paj1234567894 分钟前
JDK1.8新增特性
java·开发语言
IT古董12 分钟前
【人工智能】Python在机器学习与人工智能中的应用
开发语言·人工智能·python·机器学习
繁依Fanyi15 分钟前
简易安卓句分器实现
java·服务器·开发语言·算法·eclipse
慧都小妮子26 分钟前
Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图
java·pdf·.net
m512731 分钟前
LinuxC语言
java·服务器·前端
IU宝35 分钟前
C/C++内存管理
java·c语言·c++
湫ccc35 分钟前
《Python基础》之pip换国内镜像源
开发语言·python·pip
瓜牛_gn36 分钟前
依赖注入注解
java·后端·spring