`

Java安全—Java实现消息摘要算法加密

阅读更多

一.概述

        我们打开Apache的官网的如下页面,可以看到md5,点击md5的超链接,在新打开的页面将看到一串字符串,即是MD5的消息摘要。

        消息摘要算法有:MD(Message Digest)、SHA(Secure Hash Algorithm)、MAC(Message Authentication Code),它们的作用是验证数据完整性,是数字签名核心算法。

 

二.消息摘要算法MD

        MD家族(128位摘要信息),除MD5外,还有MD2、MD4。

        BC的算法对JDK算法的补充;CC的MD算法的底层实现其实就是JDK提供的,方便开发者使用。

package com.bijian.study;

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

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD4Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class BJMD5 {

	private static String src = "bj security md";
	
	public static void main(String[] args) {
		jdkMD5();
		jdkMD2();
		bcMD5();
		bcMD4();
		bcMD4_2();
		getProviderTest();
		ccMD5();
		ccMD2();
	}
	
	public static void jdkMD5() {
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			byte[] md5Bytes = md.digest(src.getBytes());
			System.out.println("JDK MD5:" + Hex.encodeHexString(md5Bytes));
		}catch(NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	
	public static void jdkMD2() {
		try {
			MessageDigest md = MessageDigest.getInstance("MD2");
			byte[] md2Bytes = md.digest(src.getBytes());
			System.out.println("JDK MD2:" + Hex.encodeHexString(md2Bytes));
		}catch(NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	
	public static void bcMD5() {
		Digest digest = new MD5Digest();
		digest.update(src.getBytes(), 0, src.getBytes().length);
		byte[] md5Bytes = new byte[digest.getDigestSize()];
		digest.doFinal(md5Bytes, 0);
		System.out.println("BC MD5:" + org.bouncycastle.util.encoders.Hex.toHexString(md5Bytes));
	}
	
	public static void bcMD4() {
		Digest digest = new MD4Digest();
		digest.update(src.getBytes(), 0, src.getBytes().length);
		byte[] md4Bytes = new byte[digest.getDigestSize()];
		digest.doFinal(md4Bytes, 0);
		System.out.println("BC MD4:" + org.bouncycastle.util.encoders.Hex.toHexString(md4Bytes));
	}
	
	//通过Security.addProvider方式给JDK动态添加Provider
	public static void bcMD4_2() {
		try {
			Security.addProvider(new BouncyCastleProvider());
			MessageDigest md = MessageDigest.getInstance("MD4");
			System.out.println(md.getProvider());//BC version 1.49
			byte[] md4Bytes = md.digest(src.getBytes());
			System.out.println("BC MD4:" + Hex.encodeHexString(md4Bytes));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	
	//如果设置了BouncyCastleProvider,再去获得相应算法时,得到的还是JDK的
	public static void getProviderTest() {
		try {
			Security.addProvider(new BouncyCastleProvider());
			MessageDigest md = MessageDigest.getInstance("MD5");
			System.out.println(md.getProvider());//SUN version 1.6
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	
	public static void ccMD5() {
		System.out.println("CC MD5:" + DigestUtils.md5Hex(src.getBytes()));
	}
	
	public static void ccMD2() {
		System.out.println("CC MD2:" + DigestUtils.md2Hex(src.getBytes()));
	}
}

运行结果:

JDK MD5:0cf7225221a46eb7fb10c46c4e415344
JDK MD2:d4d6c6a7bd4aaf821453ce1df02c597c
BC MD5:0cf7225221a46eb7fb10c46c4e415344
BC MD4:e0950c38aedccf757dcb07424425be44
BC version 1.49
BC MD4:e0950c38aedccf757dcb07424425be44
SUN version 1.6
CC MD5:0cf7225221a46eb7fb10c46c4e415344
CC MD2:d4d6c6a7bd4aaf821453ce1df02c597c

        应用:在用户注册认证时,对密码进行MD摘要处理后保存。



三.消息摘要算法SHA

         SHA算法是一个安全散列算法,是固定长度摘要信息。包括SHA-1、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)算法。

package com.bijian.study;

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

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.digests.SHA224Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class BJSHA {

	private static String src = "bj security sha";
	
	public static void main(String[] args) {
		jdkSHA1();
		bcSHA1();
		bcSHA224();
		bcSHA224_2();
		ccSHA1();
	}
	
	public static void jdkSHA1() {

		try {
			MessageDigest md = MessageDigest.getInstance("SHA");
			md.update(src.getBytes());
			System.out.println("jdk sha-1:" + Hex.encodeHexString(md.digest()));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	
	public static void bcSHA1() {
		Digest digest = new SHA1Digest();
		digest.update(src.getBytes(), 0, src.getBytes().length);
		byte[] sha1Bytes = new byte[digest.getDigestSize()];
		digest.doFinal(sha1Bytes, 0);
		System.out.println("bc sha-1:" + org.bouncycastle.util.encoders.Hex.toHexString(sha1Bytes));
	}
	
	public static void bcSHA224() {
		Digest digest = new SHA224Digest();
		digest.update(src.getBytes(), 0, src.getBytes().length);
		byte[] sha224Bytes = new byte[digest.getDigestSize()];
		digest.doFinal(sha224Bytes, 0);
		System.out.println("bc sha-224:" + org.bouncycastle.util.encoders.Hex.toHexString(sha224Bytes));
	}
	
	//Provider方式实现SHA224
	public static void bcSHA224_2() {
		try {
			Security.addProvider(new BouncyCastleProvider());
			MessageDigest md = MessageDigest.getInstance("SHA224");
			System.out.println(md.getProvider());//BC version 1.49
			byte[] sha224Bytes = md.digest(src.getBytes());
			System.out.println("bc sha-224_2:" + Hex.encodeHexString(sha224Bytes));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	
	public static void ccSHA1() {
		System.out.println("cc sha1-1:" + DigestUtils.sha1Hex(src.getBytes()));
		System.out.println("cc sha1-2:" + DigestUtils.sha1Hex(src));
	}
}

运行结果:

jdk sha-1:8195da0382300aac158cfc55c61fb58478a0ebe2
bc sha-1:8195da0382300aac158cfc55c61fb58478a0ebe2
bc sha-224:34533e26cfa2b14e6f21d731148bb589233bcc2a10136fa3b4a5ec97
BC version 1.49
bc sha-224_2:34533e26cfa2b14e6f21d731148bb589233bcc2a10136fa3b4a5ec97
cc sha1-1:8195da0382300aac158cfc55c61fb58478a0ebe2
cc sha1-2:8195da0382300aac158cfc55c61fb58478a0ebe2

        打开Firxfox,我们可以看到SHA的应用。


        消息摘要算法经典用法:


        消息鉴别是指在接收方将原始信息进行摘要,然后与接收到的摘要信息进行比对。当然,在发送消息中比较常用的做法是:a.加入约定Key;b.增加时间戳;c.排序。

        如:http://***?msg=12Had47mj&timestamp=1325252526,其中msg:原始消息+key+时间戳。具体也可以参考腾讯的Open API。

 

四.消息摘要算法MAC

        MAC:Message Authentication Code,HMAC:keyed-Hash Message Authentication Code,含有密钥的散列函数算法,融合MD、SHA。

        MD系列:HmacMD2、HmacMD4、HmacMD5。

        SHA系列:HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512。

        应用如SecureCRT。

package com.bijian.study;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;

public class BJHmac {

	private static String src = "bj security hmac";
	
	public static void main(String[] args) {
		jdkHmacMD5();
		bcHmacMD5();
	}
	
	//JDK的Hmac的MD5算法
	public static void jdkHmacMD5() {
		try {
			//初始化KeyGenerator
			KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
			SecretKey secretKey = keyGenerator.generateKey();//产生密钥
//			byte[] key = secretKey.getEncoded();//获得密钥
			
			byte[] key = Hex.decodeHex(new char[]{'a','a','a','a','a','a','a','a','a','a'});
			
			SecretKey restoreSecreKey = new SecretKeySpec(key, "HmacMD5");//还原密钥
			Mac mac = Mac.getInstance(restoreSecreKey.getAlgorithm());//实例化MAC
			mac.init(restoreSecreKey);
			byte[] hmacMD5Bytes = mac.doFinal(src.getBytes());
			System.out.println("jdk hmacMD5:" + Hex.encodeHexString(hmacMD5Bytes));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (DecoderException e) {
			e.printStackTrace();
		}
	}
	
	//BC的Hmac的MD5算法
	public static void bcHmacMD5() {
		HMac hmac = new HMac(new MD5Digest());
		hmac.init(new KeyParameter(org.bouncycastle.util.encoders.Hex.decode("aaaaaaaaaa")));
		hmac.update(src.getBytes(), 0, src.getBytes().length);
		
		byte[] hmacMD5Bytes = new byte[hmac.getMacSize()];//执行摘要
		hmac.doFinal(hmacMD5Bytes, 0);
		
		System.out.println("bc hmacMD5:" + Hex.encodeHexString(hmacMD5Bytes));
	}
}

运行结果:

jdk hmacMD5:cc31626a65895732de1bc6b53cd89dca
bc hmacMD5:cc31626a65895732de1bc6b53cd89dca

算法的典型应用:

 

五.其它消息摘要算法

        1.RipeMD

        2.Tiger

        3.Whirlpool

        4.GOST3411

        以上几类都是Bouncy Castle实现

 

学习视频地址:http://www.imooc.com/learn/286

  • 大小: 42.8 KB
  • 大小: 11.8 KB
  • 大小: 43.5 KB
  • 大小: 34.7 KB
  • 大小: 179.7 KB
  • 大小: 24.8 KB
  • 大小: 63.3 KB
  • 大小: 30.2 KB
分享到:
评论

相关推荐

    java加密算法:Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法

    java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...

    基于Java实现的同态加密算法的实现

    在"research_encrypt-code"这个压缩包中,很可能包含了Java实现同态加密算法的源代码,包括密钥管理、加密、解密和操作加密数据的函数。通过研究这些代码,我们可以深入了解如何在实际应用中利用Java来构建安全的...

    java加密算法实现

    在Java编程语言中,加密算法是信息安全领域的重要组成部分,用于保护数据的隐私和安全。本文将详细介绍Java中常见的加密算法的实现,以及如何在JDK 1.8环境下进行操作。 1. **对称加密算法** 对称加密是最基础的...

    AES加密算法(java)实现

    AES高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种...本软件是用java语言开发,实现了AES算法对文件的加密和解密,并在界面上加了进度条,来提示用户加密解密的进度。如果不足之处,欢迎留言。

    JAVA 加密算法(很好的算法,经典摘要)

    Java加密算法是信息安全领域中的重要组成部分,用于保护数据的隐私性和完整性。在Java平台上,有多种内置的加密库,如Java Cryptography Extension (JCE) 和 Java Cryptography Architecture (JCA),它们为开发者...

    Java实现的RSA加密解密算法示例

    Java实现的RSA加密解密算法示例 本文主要介绍了Java实现的RSA加密解密算法,结合实例形式分析了Java RSA加密解密算法的相关实现技巧。 知识点1:RSA加密解密算法简介 RSA加密解密算法是一种非对称加密算法,由Ron...

    java实现置换加密算法

    自己写的java实现的置换加密算法,信息安全课程上机实验,欢迎大家下载

    JAVA实现BGN同态加密算法

    BGN是一种同态加密方案,是Boned D等人在2005提出的一种具有全同态性质的加密方案。和传统的仅能支持单同态的elgamal和paillier加密方案...BGN的实现我们主要使用JAVA中的大整数math.BigInteger类以及双线性库JPBC实现

    用Java实现的DES加密算法

    本程序是java语言实现的DES加密算法的实例。

    JAVA上加密算法的实现用例

    Java的API提供了便捷的接口来实现各种加密和解密操作,如`MessageDigest.getInstance()`用于获取特定算法的消息摘要实例,`Cipher.getInstance()`用于获取加密或解密实例。 对于实际应用,开发者需要注意以下几点:...

    祖冲之密码算法Java实现

    9. **性能优化**:虽然祖冲之算法本身已经设计得很高效,但在Java中实现时,仍需要注意内存管理和计算性能,以适应可能的大规模数据加密需求。 10. **文档编写**:为了方便其他开发者理解和使用你的实现,需要编写...

    java实现的RC4加密解密算法示例

    此外,本站还提供了各种在线加密解密工具,包括MD5在线加密工具、哈希算法加密工具、URL加密解密工具等,供大家参考和使用。 最后,希望本文所述对大家的java程序设计有所帮助,并且提供了一个简单的RC4加密解密...

    JAVA实现的sha256加密算法

    java实现的sha256加密算法

    消息摘要算法在Java Web系统中的应用.pdf

    消息摘要算法在 Java Web 系统中的应用 ...消息摘要算法是 Java Web 系统中的一种非常重要的安全技术,广泛应用于加密、解密、数据完整性等方面,对提高系统的安全性和保护用户的敏感信息起着至关重要的作用。

    JAVA实现AES加密算法代码.doc

    使用 JAVA 实现 AES 加密算法代码可以提供高级的安全保护,保护数据免受未经授权的访问和篡改。 知识点: 1. JAVA 实现 AES 加密算法代码的原理和实现 2. AES 加密算法的特点和优点 3. JAVA 加密 API 的使用,包括...

    Java实现AES加密算法

    Java实现AES加密算法Java实现AES加密算法

    java 加密算法的代码实现

    Java加密算法是信息安全领域的重要组成部分,它用于保护数据的隐私和完整性。在Java中,有多种加密技术可供选择,如消息摘要、对称加密、非对称加密以及数字签名。以下将详细介绍这些加密方法。 首先,消息摘要算法...

    Java加密 消息摘要算法SHA实现详解.zip

    消息摘要算法(如SHA)是其中的一种加密手段,用于验证数据的完整性和防止篡改。本文将深入探讨SHA(Secure Hash Algorithm)在Java中的实现,并提供详细的知识点解析。 SHA全称为安全哈希算法,它是一种非对称加密...

    信息安全实习一古典加密算法 实现swing图形化

    在信息安全领域,实习项目往往是为了让学生深入理解和应用理论知识,本次实习的主题是“古典加密算法的实现”,并结合了Java的Swing库来构建图形用户界面(GUI)。实习旨在通过实际操作,帮助实习生掌握密码学的基本...

Global site tag (gtag.js) - Google Analytics