百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Java实现MD5加盐加密算法(md5盐值加密)

wptr33 2025-07-01 23:41 21 浏览

MD5加密
MD5是常用的加密算法,在用户注册时通过算法加密的密码存入数据库,保护用户密码,数据库管理员不能直接看见密码,即使用户数据库被盗,没有存储明文的密码对用户来说也多了一层安全保障。用户登录时,在客户端用户输入密码后,也会使用MD5进行加密,这样即使用户的网络被窃听,窃听者依然无法拿到用户的原始密码。

MD5加盐加密
数据通过MD5加密后,可以轻松的通过上面的工具解密,但是为了提高密码的安全性,可以使用Java实现MD5的随机加盐加密,这样以来就很难解密了,必须使用原密码才能正常的登录系统了,以下为Java实现的MD5随机加盐加密,以及使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转:

MD5加盐加密原理
MD5生成的哈希值是128位二进制数,32位16进制数

  1. 生成含有随机盐的字符串
    生成16位随机数,也就是盐
    将字符串与盐连接得到新的字符串,进入第二步
  2. 处理字符串:
    利用Java自带的加密类Message处理密码字符串,得到字节数组
    将字节数组转换成16进制数
    返回加密后的32位16进制数
  3. 处理32位进制数存入数据库
    将盐和32位字符串都存入数据库
  4. 验证
    从数据库读出字符串,处理成32位16进制数和盐,将盐和用户输入的密码再生成32位16进制数,与字符串提取的32位16进制数对比

Java代码实现

package com.neuedu.Utils;

//import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
//import java.security.NoSuchAlgorithmException;
import java.util.Random;
 
public class MD5Utils {
 
  /**
     * byte[]字节数组 转换成 十六进制字符串
     * 
     * @param arr 要转换的byte[]字节数组
     *
     * @return  String 返回十六进制字符串
     */
     public static String hex(byte[] arr) {
	     StringBuffer sb = new StringBuffer();
	     for (int i = 0; i < arr.length; ++i) {
		     sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3));
	     }
	     return sb.toString();
     }
 
 
 
 
   /**
     * MD5加密,并把结果由字节数组转换成十六进制字符串
     * 
     * @param str 要加密的内容
     * 
     * @return String 返回加密后的十六进制字符串
     */
     public static  String md5Hex(String str) {
       try {
           MessageDigest md = MessageDigest.getInstance("MD5");
           byte[] digest = md.digest(str.getBytes());
           return hex(digest);
       } catch (Exception e) {
           e.printStackTrace();
           //System.out.println(e.toString());
           return "";
       }
     }
 
 
 
   /**
     * 生成含有随机盐的密码
     *
     * @param password 要加密的密码
     *
     * @return String 含有随机盐的密码
     */
     public static  String getSaltMD5(String password){
		// 生成一个16位的随机数
        Random random = new Random();
        StringBuilder sBuilder = new StringBuilder(16);
        sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));
        int len = sBuilder.length();
        if (len < 16) {
              for (int i = 0; i < 16 - len; i++) {
                sBuilder.append("0");
            }
        }
        // 生成最终的加密盐
        String salt = sBuilder.toString();
        password = md5Hex(password + salt);
        char[] cs = new char[48];
        for (int i = 0; i < 48; i += 3) {
            cs[i] = password.charAt(i / 3 * 2);
            char c = salt.charAt(i / 3);
            cs[i + 1] = c;
            cs[i + 2] = password.charAt(i / 3 * 2 + 1);
        }
        return String.valueOf(cs);
     }
 
 
 
   /**
     * 验证加盐后是否和原密码一致
     * 
     * @param password 原密码
     * 
     * @param password 加密之后的密码
     * 
     *@return boolean true表示和原密码一致   false表示和原密码不一致
     */
     public static   boolean getSaltverifyMD5(String password, String md5str) {
        char[] cs1 = new char[32];
        char[] cs2 = new char[16];
        for (int i = 0; i < 48; i += 3) {
            cs1[i / 3 * 2] = md5str.charAt(i);
            cs1[i / 3 * 2 + 1] = md5str.charAt(i + 2);
            cs2[i / 3] = md5str.charAt(i + 1);
        }
        String Salt = new String(cs2);
        return md5Hex(password + Salt).equals(String.valueOf(cs1));
     }

}


原文链接:

https://blog.csdn.net/weixin_44225940/article/details/104352764

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...