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

Java加密与解密之消息摘要算法1(消息摘要(hash函数编码法),又称数字指纹 ( ))

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

消息摘要算法有3大类,分别是:MD、SHA、MAC,通常用于数据完整性的验证。

MD:Message Digest消息摘要算法。包括:MD2,MD4,MD5 3种算法。

SHA:Secure Hash Algorithm安全散列算法。包括:SHA-1和SHA-2系列,包含了SHA-224,SHA-256,SHA-384,SHA-512。

Hmac:Message Authentication Code消息认证码算法。包含:HmacMD5,HmacSHA1,HmacSHA256,HmacSHA384,HmacSHA512。

消息摘要算法也可称为散列算法,它的核心就是散列函数,通过散列函数获取一串散列值,由于散列函数是单向的,所以不能通过得到的散列值还原原始值信息。我们一般通过这类算法来加密我们的密码,比如用户在我们的web页面注册后,我们会把用户设置的密码通过md5或者sha来加密。

环境:JDK1.8

代码示例:

public class MD5Demo {
	
	private static final String ALGORITHM = "md5" ;

	/**
	 *	<p>
	 *     MD5消息摘要算法
	 *  </p>
	 *	2020年10月8日 下午1:33:18
	 *	@author xg
	 *	@param source 需要处理的源数据
	 *	@return byte[]  消息摘要结果
	 *	@throws Exception
	 */
	public static byte[] encodeMD5(byte[] source) throws Exception {
		// 初始化MessageDigest
		MessageDigest md = MessageDigest.getInstance(ALGORITHM) ;
		// 执行消息摘要
		return md.digest(source) ;
	}
	/**
	 *	<p>
	 *     将字节数组转成16进制(这里大家可以用第三方的工具转换,我这里懒得引包了)
	 *  </p>
	 *	2020年10月8日 下午1:36:15
	 *	@author xg
	 *	@param digest 摘要数据
	 *	@return String 16进制数据
	 */
	public static String hex(byte[] digest) {
		StringBuilder sb = new StringBuilder() ;
		for (byte b : digest) {
			String str = Integer.toHexString(b & 0xff) ;
			if (str.length() < 2) {
				sb.append("0" + str) ;
			} else {
				sb.append(str) ;
			}
		}
		return sb.toString() ;
	}
	
	public static void main(String[] args) throws Exception {
		byte[] source = "我是MD5消息摘要算法".getBytes() ;
		String md5 = hex(encodeMD5(source)) ;
		System.out.println(md5) ;
	}
}

代码很简单其实就是两步就完成了。

1、初始化MessageDigest

2、执行digest消息摘要

在工作中我们一般不会这么简单的使用我们会对要生成的摘要数据进行加盐处理

比如这里我们的进行摘要的数据是:

String s = "我是MD5消息摘要算法" ;

加入我们系统中有身份证号码字段也或者是用户名字段(切记一定要唯一哦不可变的),那我们可以把这个s字符串和身份证号码字段拼接在一起后再执行MD5消息摘要

身份证:xxxxxxxxxxxxxxxx914


byte[] source = "我是MD5消息摘要算法xxxxxxxxxxxxxxxx914".getBytes() ;
String md5 = hex(encodeMD5(source)) ;
System.out.println(md5) ;

第三方的实现有:

Bouncy Castle(BC)、Commons Codec

JDK自身支持的算法不多一般来说是够用了,BC这个支持的算法比较多。比如MD4算法JDK不支持,如果你要是用MD4那只能使用BC了。

如何使用BC?

很简单只需要加入BC的包,然后再代码中加入一行代码即可。

public static byte[] encodeMD5(byte[] source) throws Exception {
		Security.addProvider(new BouncyCastleProvider()) ;
		// 初始化MessageDigest
		MessageDigest md = MessageDigest.getInstance(ALGORITHM) ;
		// 执行消息摘要
		return md.digest(source) ;
	}

注意这里的:Security.addProvider(new BouncyCastleProvider()) ;





SHA算法

SHA算法是基于MD4算法实现的,SHA于MD不同之处主要就是摘要的长度不同,SHA长度比MD要长也就是安全性更高。

SHA算法的发展:

SHA-0:由NIST公布的第一个版本FIPS PUB 180,该算法由于存在降低密码安全性的错误而导致未推出就夭折。

SHA-1:由NIST发布的第二个版本FIPS PUB 180-1,简称为:SHA-1。

SHA-2:由NIST发布包含有:SHA-224,SHA-256,SHA-384,SHA-512,这里的数字是表示了摘要信息字节长度。

代码示例(这里可以直接使用前面的例子即可,修改下对应的算法即可):

package com.pack.security.sha;

import java.security.MessageDigest;
import java.security.Security;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class SHADemo {
	
	private static final String ALGORITHM = "SHA" ;

	/**
	 *	<p>
	 *     SHA消息摘要算法
	 *  </p>
	 *	2020年10月8日 下午1:33:18
	 *	@author xg
	 *	@param source 需要处理的源数据
	 *	@return byte[]  消息摘要结果
	 *	@throws Exception
	 */
	public static byte[] encodeMD5(byte[] source) throws Exception {
		Security.addProvider(new BouncyCastleProvider()) ;
		// 初始化MessageDigest
		MessageDigest md = MessageDigest.getInstance(ALGORITHM) ;
		// 执行消息摘要
		return md.digest(source) ;
	}
	/**
	 *	<p>
	 *     将字节数组转成16进制(这里大家可以用第三方的工具转换,我这里懒得引包了)
	 *  </p>
	 *	2020年10月8日 下午1:36:15
	 *	@author xg
	 *	@param digest 摘要数据
	 *	@return String 16进制数据
	 */
	public static String hex(byte[] digest) {
		StringBuilder sb = new StringBuilder() ;
		for (byte b : digest) {
			String str = Integer.toHexString(b & 0xff) ;
			if (str.length() < 2) {
				sb.append("0" + str) ;
			} else {
				sb.append(str) ;
			}
		}
		return sb.toString() ;
	}
	
	public static void main(String[] args) throws Exception {
		byte[] source = "我是SHA消息摘要算法".getBytes() ;
		String md5 = hex(encodeMD5(source)) ;
		System.out.println(md5) ;
	}
}

SHA-0和SHA-1生成的摘要信息16进制是40位的字节长度是160位。

SHA-xxx这类的是摘要长度是对应的数字长度比如:SHA-512那摘要字节长度就是512位。

在JDK8中支持的有SHA-256,SHA-384,SHA-512;如果要是用SHA-224那你只能使用第三方的库BC了。具体使用方法上面讲MD时已经说了。



文件校验:

在很多网站上下载文件时我们可能都见过如下图:

我们点击这里的sha512 页面会输出如下内容:


这个内容就是当前下载文件生成的摘要信息,算法使用的是sha512

当下载这个文件后我们也可以通过sha512算法生成这个文件的sha512摘要信息,然后与网站提供的这个sha512摘要信息进行比对,如果相同证明这个文件没有被篡改,否则你下载的这个文件肯定是有问题的,很可能被植入了病毒等。

接下来我们来看如何把下载的文件去生成摘要信息:


完毕!!!


MAC(Hmac)算法会在下一篇文章中介绍,Hmac算法稍微比MD,SHA算法要复杂点,主要是多了个密钥。

相关推荐

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+树),用于...