Java MD5 加密工具类

article/2025/9/2 22:16:44

一、MD5简介

        MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

        MD5算法是不可逆的。

        MD5 由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,由MD2、MD3、MD4发展而来。

        MD5算法简要的叙述为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。 [2]

       总体流程如下图所示, 表示第i个分组,每次的运算都由前一轮的128位结果值和第i块512bit值进行运算。

      

 

二、MD5 加密工具类


import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** MD5加密/验证工具类**/
public class MD5Utils {static final char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};static final char hexDigitsLower[] = { '0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };/***   对字符串 MD5 无盐值加密*   * @param plainText* 		传入要加密的字符串* @return*  	MD5加密后生成32位(小写字母+数字)字符串*/public static String MD5Lower(String plainText) {try {// 获得MD5摘要算法的 MessageDigest 对象MessageDigest md = MessageDigest.getInstance("MD5");// 使用指定的字节更新摘要md.update(plainText.getBytes());// digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值。1 固定值return new BigInteger(1,  md.digest()).toString(16);} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}/***  对字符串 MD5 加密* * @param plainText* 		传入要加密的字符串* @return* 		MD5加密后生成32位(大写字母+数字)字符串*/public static String MD5Upper(String plainText) {try {// 获得MD5摘要算法的 MessageDigest 对象MessageDigest md = MessageDigest.getInstance("MD5");// 使用指定的字节更新摘要md.update(plainText.getBytes());// 获得密文byte[] mdResult = md.digest();// 把密文转换成十六进制的字符串形式int j = mdResult.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = mdResult[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];// 取字节中高 4 位的数字转换, >>> 为逻辑右移,将符号位一起右移str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换}return new String(str);} catch (Exception e) {e.printStackTrace();return null;}}/***   对字符串 MD5 加盐值加密*   * @param plainText* 		传入要加密的字符串* @param saltValue* 		传入要加的盐值* @return*  	MD5加密后生成32位(小写字母+数字)字符串*/public static String MD5Lower(String plainText, String saltValue) {try {// 获得MD5摘要算法的 MessageDigest 对象MessageDigest md = MessageDigest.getInstance("MD5");// 使用指定的字节更新摘要md.update(plainText.getBytes());md.update(saltValue.getBytes());// digest()最后确定返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符// BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值。1 固定值return new BigInteger(1,  md.digest()).toString(16);} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}/***   对字符串 MD5 加盐值加密*   * @param plainText* 		传入要加密的字符串* @param saltValue* 		传入要加的盐值* @return*  	MD5加密后生成32位(大写字母+数字)字符串*/public static String MD5Upper(String plainText, String saltValue) {try {// 获得MD5摘要算法的 MessageDigest 对象MessageDigest md = MessageDigest.getInstance("MD5");// 使用指定的字节更新摘要md.update(plainText.getBytes());md.update(saltValue.getBytes());// 获得密文byte[] mdResult = md.digest();// 把密文转换成十六进制的字符串形式int j = mdResult.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = mdResult[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {e.printStackTrace();return null;}}/***  MD5加密后生成32位(小写字母+数字)字符串*    同 MD5Lower() 一样*/public final static String MD5(String plainText) {try {MessageDigest mdTemp = MessageDigest.getInstance("MD5");mdTemp.update(plainText.getBytes("UTF-8"));byte[] md = mdTemp.digest();int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigitsLower[byte0 >>> 4 & 0xf];str[k++] = hexDigitsLower[byte0 & 0xf];}return new String(str);} catch (Exception e) {return null;}}/***  校验MD5码* * @param text*      	要校验的字符串* @param md5*            md5值* @return 校验结果*/public static boolean valid(String text, String md5) {return md5.equals(MD5(text)) || md5.equals(MD5(text).toUpperCase());}/*** 测试 * @param args*/public static void main(String[] args) {String plainText = "admin";String saltValue = "admin123";System.out.println(MD5Lower(plainText)); System.out.println(MD5Upper(plainText));System.out.println(MD5Lower(plainText, saltValue));System.out.println(MD5Upper(plainText, saltValue));System.out.println(MD5(plainText));System.out.println("=====校验结果======");System.out.println(valid(plainText,MD5(plainText)));}
}

   

MD5算法解析及实现 这篇文章不错(虽然没看明白 ^_^ )

 


http://chatgpt.dhexx.cn/article/RQkh4Ah5.shtml

相关文章

为什么md5不可逆,却还可能被md5免费解密网站解密

md5在网络安全中起到非常重要的作用&#xff0c;它被用于保证数据的完整性&#xff0c;以及数据不被篡改。同时&#xff0c;md5还被用来进行密码加密。一些朋友不了解为什么md5不可逆&#xff0c;却还可能被号称能解密md5的网站解密。因此&#xff0c;有人说md5不够安全&#x…

matlab中进行多行注释,取消

在MATLAB中可以在行首部加 1 %来进行注释&#xff0c; 2 加%%空格来进行划分不同的程序段。 但在进行多行注释时&#xff0c;针对单行进行操作过于麻烦&#xff0c;可以利用快捷键进行多行注释。 可以先选中需要注释的行&#xff0c;然后按“ctrlR”进行注释&#xff0c; 多…

Matlab多行注释单行程序分行写

2019独角兽企业重金招聘Python工程师标准>>> 一、Matlab注释 1&#xff09;、单行注释&#xff1a;当然是行首加‘%’了。 2&#xff09;、多行注释&#xff1a; a、选中你要加注释的内容&#xff0c;然后选择工具菜单“text|comment”就可以了&#xff0c; 快捷键是…

funcode游戏实训,java及C/C++,网上整理

软件&#xff0c;常见错误都有。 所有资源可到公众号获取(源码也是)&#xff0c;不再直接分享

funcode环境配置(亲测有效)

vmware 虚拟机版本是15.5.1 虚拟机版本链接 win7专业版镜像文件 迅雷(打开迅雷复制即可) ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/ 过程可供参考 vc2012任何版本均可 设置过程&#xff1a; 打…

funcode实验--海底世界(c++实现)

C语言课程设计一海底世界 一、实验内容 海底有若干条鱼&#xff0c;其中若干条相同的鱼向一个方向游动&#xff0c;另一条来回随机游动&#xff0c;由玩家用键盘W A S D控制另外一条游动。 要求如下&#xff1a; 1、 来回游动的鱼&#xff0c;从屏幕左边游进来&#xff0c;…

FunCode太空战机C++实现

仅供交流学习使用&#xff0c;因博主水平有限&#xff0c;有错误欢迎批评指正 作者&#xff08;即博主本人&#xff09;&#xff1a; Akame Qixisi / Excel Bloonow IDE&#xff1a;Code::Blocks 17.12 编译器需要支持C14或以上标准&#xff08;Code::Blocks如何设置见附录Ⅰ&…

基于funcode的闯关小游戏(山东省齐鲁软件设计大赛三等奖)给自己留个纪念

背景&#xff1a; &#xff08;链接文档在最后&#xff09; 19年的暑假&#xff0c;同学喊我参加山东省齐鲁软件设计大赛&#xff0c;报上名之后有这个funcode课题。d但是从来没有接触过funcode&#xff0c;网上的参考资料也不多&#xff0c;靠着自己摸索和同学交流半懂半做了这…

基于Funcode设计C语言游戏–迷你高尔夫

Funcode设计 文章目录 Funcode设计前言一、Funcode下载地址二、C语言课程设计--迷你高尔夫1.效果图2.部分代码 总结 前言 基于Funcode设计的C语言游戏。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Funcode下载地址 Win10版本 提取码&#xf…

2021年Funcode游戏制作二等奖作品

之前发的有关funcode游戏更多的则是对游戏流程有一个大概的了解&#xff0c;以及如何编写游戏循环&#xff0c;判定游戏的各种触发条件&#xff0c;较为简陋。 这一次看到有人问funcode游戏的制作&#xff0c;就把搁置了许久的 项目拿给大家作为参考建议。 素材来源&#xff1a…

【致敬童年】Funcode实现坦克大战

【2023年5月26日】 带10个需求的资源已上传至Funcode实现坦克大战&#xff08;十个需求&#xff09; 【效果图】 【写在前面的话】 1、虚函数哪里很难受&#xff0c;最后在Commclass里面加了一个无参构造才搞定 2、bug很多&#xff0c;比如世界边界&#xff0c;子弹都有问题。…

Funcode游戏设计C语言小飞虫

Funcode游戏制作 文章目录 Funcode游戏制作前言一、基于Funcode的小飞虫二、使用步骤1.游戏效果图2.游戏代码 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&…

【C++FunCode】基于Funcode使用C++语言编写小游戏(小鲨鱼历险记)

一、前言 大一暑假参加了山东省软件设计大赛&#xff0c;基于FunCode平台使用C语言编写了大鱼吃小鱼游戏&#xff0c;其美名曰小鲨鱼历险记&#xff0c;哈哈。比赛成绩惨烈&#xff0c;只拿了一个省三&#xff0c;赛后也进行了分析总结&#xff0c;主要还是太不重视比赛&#…

Funcode实现坦克大战(十个需求)

【写在前言】 1、操作 先按数字&#xff08;1~0&#xff09;10个 表示选择某一需求&#xff08;对应文件的需求&#xff09; 再按K 表示执行该需求&#xff08;控制台有输出&#xff09; 2、写此文为方便大家的学习&#xff0c;希望不要一抄了事&#xff0c;真心希望&#xff0…

Funcode海底世界c++(vc6)

海底有五条鱼&#xff0c;其中四条来回随机游动&#xff0c;由玩家用键盘W A S D控制另外一条游动。 要求如下&#xff1a; 游戏初始界面如下图。来回游动的四条鱼&#xff0c;从屏幕左边游进来&#xff0c;均已一个随机速度水平游动。从屏幕右侧游出去&#xff0c;很快又从屏…

Funcode实现打飞虫1

简介&#xff1a; “拍飞蝇”是一款非常受欢迎的小游戏&#xff0c;这个游戏的玩法非常简单&#xff0c;玩家需要控制一个拍子来打飞来的苍蝇。每次打死一只苍蝇&#xff0c;就能够获得一定的分数。同时&#xff0c;也会有不同种类的苍蝇出现&#xff0c;它们的移动速度和得分也…

进击系列2.0:进击的骑士-----用funcode与C语言实现射击游戏制作

funcode实现射击游戏----进击的骑士 相关程序&#xff1a;https://download.csdn.net/download/hidden_sword/86237168 制作软件funcode funcode为一款可以进行二维游戏制作的软件&#xff0c;可以兼容vc6.0及codeblocks等C语言编译器。funcode可实现动画制作&#xff0c;地…

Funcode实现黄金矿工

前言&#xff1a; 一步步按照下面的步骤走&#xff0c;肯定是可以运行的。 此文优化了文档中的一些Bug 代码不是很重要&#xff0c;最重要的还是学习编程的思想。毕竟funcode并不是一个常用的软件 如果有问题&#xff0c;欢迎在下面留言&#xff0c;我会竭尽所能进行解答 一、准…

Funcode学习笔记:完成Run、Jump、Idle等动作【后续更新Roll、Attack动作的实现】【By Myself】

先来实现Run和Idle动作吧&#xff1b; 【以下是本菜在写游戏时犯下的一些错误&#xff0c;以及一些灵感&#xff0c;即如何解决逻辑错误的&#xff1b;】 首先&#xff0c;先大概说一下我们的愿景是什么&#xff0c;当我们按下A键时&#xff0c;人物向左边运动&#xff0c;且…