Java加密与解密之消息摘要算法1

Java (32) 2024-02-15 08:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Java加密与解密之消息摘要算法1,希望能够帮助你!!!。

消息摘要算法有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()) ;

Java加密与解密之消息摘要算法1_https://bianchenghao6.com/blog_Java_第1张

Java加密与解密之消息摘要算法1_https://bianchenghao6.com/blog_Java_第2张


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时已经说了。

Java加密与解密之消息摘要算法1_https://bianchenghao6.com/blog_Java_第3张

Java加密与解密之消息摘要算法1_https://bianchenghao6.com/blog_Java_第4张

文件校验:

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

Java加密与解密之消息摘要算法1_https://bianchenghao6.com/blog_Java_第5张

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

Java加密与解密之消息摘要算法1_https://bianchenghao6.com/blog_Java_第6张

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

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

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

Java加密与解密之消息摘要算法1_https://bianchenghao6.com/blog_Java_第7张

完毕!!!

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

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

发表回复