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

Java加密与解密之消息摘要算法1 我的世界java版下载

yuyutoo 2024-10-13 00:32 5 浏览 0 评论

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

相关推荐

自卑的人容易患抑郁症吗?(自卑会导致抑郁吗)

Filephoto[Photo/IC]Lowself-esteemmakesusfeelbadaboutourselves.Butdidyouknowthatovert...

中考典型同(近)义词组(同义词考题)

中考典型同(近)义词组...

WPF 消息传递简明教程(wpf messagebox.show)

...

BroadcastReceiver的原理和使用(broadcast-suppression)

一、使用中注意的几点1.动态注册、静态注册的优先级在AndroidManifest.xml中静态注册的receiver比在代码中用registerReceiver动态注册的优先级要低。发送方在send...

Arduino通过串口透传ESP 13板与java程序交互

ESP13---是一个无线板子,配置通过热点通信Arduino通过串口透传ESP13板与java程序交互...

zookeeper的Leader选举源码解析(zookeeper角色选举角色包括)

作者:京东物流梁吉超zookeeper是一个分布式服务框架,主要解决分布式应用中常见的多种数据问题,例如集群管理,状态同步等。为解决这些问题zookeeper需要Leader选举进行保障数据的强一致...

接待外国人英文口语(接待外国友人的英语口语对话)

接待外国人英文口语询问访客身份:  MayIhaveyourname,please?  请问您贵姓?  Whatcompanyareyoufrom?  您是哪个公司的?  Could...

一文深入理解AP架构Nacos注册原理

Nacos简介Nacos是一款阿里巴巴开源用于管理分布式微服务的中间件,能够帮助开发人员快速实现动态服务发现、服务配置、服务元数据及流量管理等。这篇文章主要剖析一下Nacos作为注册中心时其服务注册与...

Android面试宝典之终极大招(android面试及答案)

以下内容来自兆隆IT云学院就业部,根据多年成功就业服务经验,以及职业素养课程部分内容,归纳总结:18.请描述一下Intent和IntentFilter。Android中通过Intent...

除了Crontab,Swoole Timer也可以实现定时任务的

一般的定时器是怎么实现的呢?我总结如下:1.使用Crontab工具,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本;2.ignore_user_abort()和set_time_li...

Spark源码阅读:DataFrame.collect 作业提交流程思维导图

本文分为两个部分:作业提交流程思维导图关键函数列表作业提交流程思维导图...

使用Xamarin和Visual Studio开发Android可穿戴设备应用

搭建开发环境我们需要做的第一件事情是安装必要的工具。因此,你需要首先安装VisualStudio。如果您使用的是VisualStudio2010,2012或2013,那么请确保它是一个专业版本或...

Android开发者必知的5个开源库(android 开发相关源码精编解析)

过去的时间里,Android开发逐步走向成熟,一个个与Android相关的开发工具也层出不穷。不过,在面对各种新鲜事物时,不要忘了那些我们每天使用的大量开源库。在这里,向大家介绍的就是,在这个任劳任怨...

Android事件总线还能怎么玩?(android实现事件处理的步骤)

顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码...

Android 开发中文引导-应用小部件

应用小部件是可以嵌入其它应用(例如主屏幕)并收到定期更新的微型应用视图。这些视图在用户界面中被叫做小部件,并可以用应用小部件提供者发布。可以容纳其他应用部件的应用组件叫做应用部件的宿主(1)。下面的截...

取消回复欢迎 发表评论: