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

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

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

消息摘要算法有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算法要复杂点,主要是多了个密钥。

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China&#39;s top diplomat to chair third China-Pacific Island countries foreign ministers&#39; meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...