一、概述
MAC算法结合了MD5和SHA算法的优势,并加入密钥的支持,是一种更为安全的消息摘要算法。
MAC(Message Authentication Code,消息认证码算法)是含有密钥的散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加入了密钥。日次,我们也常把MAC称为HMAC(keyed-Hash Message Authentication Code)。
MAC算法主要集合了MD和SHA两大系列消息摘要算法。MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384.HmacSHA512五种算法。
经过MAC算法得到的摘要值也可以使用十六进制编码表示,其摘要值长度与参与实现的摘要值长度相同。例如,HmacSHA1算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制码,换算成十六进制编码为40位。
二、实现和应用
1、Sun的实现和应用
在java6中,MAC系列算法需要通过Mac类提供支持。java6中仅仅提供HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384和HmacSHA512四种算法。
Mac算法是带有密钥的消息摘要算法,所以实现起来要分为两步:
1)、构建密钥
2)、执行消息摘要
- package com.tao.test;
- import java.security.NoSuchAlgorithmException;
- import javax.crypto.KeyGenerator;
- import javax.crypto.Mac;
- import javax.crypto.SecretKey;
- import javax.crypto.spec.SecretKeySpec;
- import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
- /**
- * MAC算法工具类
- * 对于HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512应用的步骤都是一模一样的。具体看下面的代码
- */
- class MACCoder {
- /**
- * 产生HmacMD5摘要算法的密钥
- */
- public static byte[] initHmacMD5Key() throws NoSuchAlgorithmException {
- // 初始化HmacMD5摘要算法的密钥产生器
- KeyGenerator generator = KeyGenerator.getInstance("HmacMD5");
- // 产生密钥
- SecretKey secretKey = generator.generateKey();
- // 获得密钥
- byte[] key = secretKey.getEncoded();
- return key;
- }
- /**
- * HmacMd5摘要算法
- * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
- */
- public static String encodeHmacMD5(byte[] data, byte[] key) throws Exception {
- // 还原密钥
- SecretKey secretKey = new SecretKeySpec(key, "HmacMD5");
- // 实例化Mac
- Mac mac = Mac.getInstance(secretKey.getAlgorithm());
- //初始化mac
- mac.init(secretKey);
- //执行消息摘要
- byte[] digest = mac.doFinal(data);
- return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串
- }
- /**
- * 产生HmacSHA1摘要算法的密钥
- */
- public static byte[] initHmacSHAKey() throws NoSuchAlgorithmException {
- // 初始化HmacMD5摘要算法的密钥产生器
- KeyGenerator generator = KeyGenerator.getInstance("HmacSHA1");
- // 产生密钥
- SecretKey secretKey = generator.generateKey();
- // 获得密钥
- byte[] key = secretKey.getEncoded();
- return key;
- }
- /**
- * HmacSHA1摘要算法
- * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
- */
- public static String encodeHmacSHA(byte[] data, byte[] key) throws Exception {
- // 还原密钥
- SecretKey secretKey = new SecretKeySpec(key, "HmacSHA1");
- // 实例化Mac
- Mac mac = Mac.getInstance(secretKey.getAlgorithm());
- //初始化mac
- mac.init(secretKey);
- //执行消息摘要
- byte[] digest = mac.doFinal(data);
- return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串
- }
- /**
- * 产生HmacSHA256摘要算法的密钥
- */
- public static byte[] initHmacSHA256Key() throws NoSuchAlgorithmException {
- // 初始化HmacMD5摘要算法的密钥产生器
- KeyGenerator generator = KeyGenerator.getInstance("HmacSHA256");
- // 产生密钥
- SecretKey secretKey = generator.generateKey();
- // 获得密钥
- byte[] key = secretKey.getEncoded();
- return key;
- }
- /**
- * HmacSHA1摘要算法
- * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
- */
- public static String encodeHmacSHA256(byte[] data, byte[] key) throws Exception {
- // 还原密钥
- SecretKey secretKey = new SecretKeySpec(key, "HmacSHA256");
- // 实例化Mac
- Mac mac = Mac.getInstance(secretKey.getAlgorithm());
- //初始化mac
- mac.init(secretKey);
- //执行消息摘要
- byte[] digest = mac.doFinal(data);
- return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串
- }
- /**
- * 产生HmacSHA256摘要算法的密钥
- */
- public static byte[] initHmacSHA384Key() throws NoSuchAlgorithmException {
- // 初始化HmacMD5摘要算法的密钥产生器
- KeyGenerator generator = KeyGenerator.getInstance("HmacSHA384");
- // 产生密钥
- SecretKey secretKey = generator.generateKey();
- // 获得密钥
- byte[] key = secretKey.getEncoded();
- return key;
- }
- /**
- * HmacSHA1摘要算法
- * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
- */
- public static String encodeHmacSHA384(byte[] data, byte[] key) throws Exception {
- // 还原密钥
- SecretKey secretKey = new SecretKeySpec(key, "HmacSHA384");
- // 实例化Mac
- Mac mac = Mac.getInstance(secretKey.getAlgorithm());
- //初始化mac
- mac.init(secretKey);
- //执行消息摘要
- byte[] digest = mac.doFinal(data);
- return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串
- }
- /**
- * 产生HmacSHA256摘要算法的密钥
- */
- public static byte[] initHmacSHA512Key() throws NoSuchAlgorithmException {
- // 初始化HmacMD5摘要算法的密钥产生器
- KeyGenerator generator = KeyGenerator.getInstance("HmacSHA512");
- // 产生密钥
- SecretKey secretKey = generator.generateKey();
- // 获得密钥
- byte[] key = secretKey.getEncoded();
- return key;
- }
- /**
- * HmacSHA1摘要算法
- * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
- */
- public static String encodeHmacSHA512(byte[] data, byte[] key) throws Exception {
- // 还原密钥
- SecretKey secretKey = new SecretKeySpec(key, "HmacSHA512");
- // 实例化Mac
- Mac mac = Mac.getInstance(secretKey.getAlgorithm());
- //初始化mac
- mac.init(secretKey);
- //执行消息摘要
- byte[] digest = mac.doFinal(data);
- return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串
- }
- }
- public class MACTest {
- public static void main(String[] args) throws Exception {
- String testString = "asdasd";
- byte[] keyHmacMD5=MACCoder.initHmacMD5Key();
- System.out.println(MACCoder.encodeHmacMD5(testString.getBytes(),keyHmacMD5));
- byte[] keyHmacSHA1=MACCoder.initHmacSHAKey();
- System.out.println(MACCoder.encodeHmacSHA(testString.getBytes(),keyHmacSHA1));
- byte[] keyHmacSHA256=MACCoder.initHmacSHA256Key();
- System.out.println(MACCoder.encodeHmacSHA256(testString.getBytes(),keyHmacSHA256));
- byte[] keyHmacSHA384=MACCoder.initHmacSHA384Key();
- System.out.println(MACCoder.encodeHmacSHA384(testString.getBytes(),keyHmacSHA384));
- byte[] keyHmacSHA512=MACCoder.initHmacSHA512Key();
- System.out.println(MACCoder.encodeHmacSHA512(testString.getBytes(),keyHmacSHA512));
- }
- }
2、BouncyCastle的实现和应用
第三方加密组件包Bouncy Castle作为补充,提供了HmacMD2.HmacMD4、HmacSHA224三种算法的支持。
- package Test;
- import java.security.NoSuchAlgorithmException;
- import java.security.Security;
- import javax.crypto.KeyGenerator;
- import javax.crypto.Mac;
- import javax.crypto.SecretKey;
- import javax.crypto.spec.SecretKeySpec;
- import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
- import org.bouncycastle.jce.provider.BouncyCastleProvider;
- /**
- * MAC算法工具类
- * 对于HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512应用的步骤都是一模一样的。具体看下面的代码
- */
- class MACCoder {
- /**
- * 产生HmacMD2摘要算法的密钥
- */
- public static byte[] initHmacMD2Key() throws NoSuchAlgorithmException {
- // 添加BouncyCastle的支持
- Security.addProvider(new BouncyCastleProvider());
- // 初始化HmacMD5摘要算法的密钥产生器
- KeyGenerator generator = KeyGenerator.getInstance("HmacMD2");
- // 产生密钥
- SecretKey secretKey = generator.generateKey();
- // 获得密钥
- byte[] key = secretKey.getEncoded();
- return key;
- }
- /**
- * HmacMd2摘要算法 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
- */
- public static String encodeHmacMD2(byte[] data, byte[] key) throws Exception {
- // 添加BouncyCastle的支持
- Security.addProvider(new BouncyCastleProvider());
- // 还原密钥
- SecretKey secretKey = new SecretKeySpec(key, "HmacMD2");
- // 实例化Mac
- Mac mac = Mac.getInstance(secretKey.getAlgorithm());
- // 初始化mac
- mac.init(secretKey);
- // 执行消息摘要
- byte[] digest = mac.doFinal(data);
- return new HexBinaryAdapter().marshal(digest);// 转为十六进制的字符串
- }
- /**
- * 产生HmacMD4摘要算法的密钥
- */
- public static byte[] initHmacMD4Key() throws NoSuchAlgorithmException {
- // 添加BouncyCastle的支持
- Security.addProvider(new BouncyCastleProvider());
- // 添加BouncyCastle的支持
- Security.addProvider(new BouncyCastleProvider());
- // 初始化HmacMD5摘要算法的密钥产生器
- KeyGenerator generator = KeyGenerator.getInstance("HmacMD4");
- // 产生密钥
- SecretKey secretKey = generator.generateKey();
- // 获得密钥
- byte[] key = secretKey.getEncoded();
- return key;
- }
- /**
- * HmacMD4摘要算法 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
- */
- public static String encodeHmacMD4(byte[] data, byte[] key) throws Exception {
- // 添加BouncyCastle的支持
- Security.addProvider(new BouncyCastleProvider());
- // 还原密钥
- SecretKey secretKey = new SecretKeySpec(key, "HmacMD4");
- // 实例化Mac
- Mac mac = Mac.getInstance(secretKey.getAlgorithm());
- // 初始化mac
- mac.init(secretKey);
- // 执行消息摘要
- byte[] digest = mac.doFinal(data);
- return new HexBinaryAdapter().marshal(digest);// 转为十六进制的字符串
- }
- /**
- * 产生HmacSHA224摘要算法的密钥
- */
- public static byte[] initHmacSHA224Key() throws NoSuchAlgorithmException {
- // 添加BouncyCastle的支持
- Security.addProvider(new BouncyCastleProvider());
- // 添加BouncyCastle的支持
- Security.addProvider(new BouncyCastleProvider());
- // 初始化HmacMD5摘要算法的密钥产生器
- KeyGenerator generator = KeyGenerator.getInstance("HmacSHA224");
- // 产生密钥
- SecretKey secretKey = generator.generateKey();
- // 获得密钥
- byte[] key = secretKey.getEncoded();
- return key;
- }
- /**
- * HmacSHA224摘要算法 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
- */
- public static String encodeHmacSHA224(byte[] data, byte[] key) throws Exception {
- // 添加BouncyCastle的支持
- Security.addProvider(new BouncyCastleProvider());
- // 还原密钥
- SecretKey secretKey = new SecretKeySpec(key, "HmacSHA224");
- // 实例化Mac
- Mac mac = Mac.getInstance(secretKey.getAlgorithm());
- // 初始化mac
- mac.init(secretKey);
- // 执行消息摘要
- byte[] digest = mac.doFinal(data);
- return new HexBinaryAdapter().marshal(digest);// 转为十六进制的字符串
- }
- }
- public class MACTest {
- public static void main(String[] args) throws Exception {
- String testString = "asdasd";
- byte[] keyHmacMD2 = MACCoder.initHmacMD2Key();
- System.out.println(MACCoder.encodeHmacMD2(testString.getBytes(), keyHmacMD2));
- byte[] keyHmacMD4 = MACCoder.initHmacMD4Key();
- System.out.println(MACCoder.encodeHmacMD4(testString.getBytes(), keyHmacMD4));
- byte[] keyHmacSHA224 = MACCoder.initHmacSHA224Key();
- System.out.println(MACCoder.encodeHmacSHA224(testString.getBytes(), keyHmacSHA224));
- }
- }
相关推荐
本文将详细介绍如何在Java中实现DES加解密和MAC算法,并探讨其应用。 首先,DES是一种对称加密算法,由IBM公司开发,后被美国国家标准局采纳为标准。它使用64位的密钥对数据进行加密和解密,但实际有效密钥长度只有...
在IT行业中,加密和解密是信息安全领域的重要...综上所述,Java加密解密算法源码涵盖了多种安全机制,开发者可以基于这些源码进一步理解并定制自己的加密解决方案。通过深入学习和实践,可以有效提升应用程序的安全性。
这个"java加密解密算法类_Cipher"可能包含了上述所有或部分知识点的实现,通过阅读源代码,我们可以更深入地理解Java中加密解密的实际应用和细节。在实际开发中,这些知识对于构建安全的网络通信、数据库存储和数据...
Java加密解密是信息安全领域中的一个关键话题,特别是在软件开发中,它对于保护敏感数据、实现安全通信至关重要。Java提供了一系列强大的加密库和API,使得开发者可以方便地进行数据加密和解密操作。本项目提供的...
为了确保数据安全,加密解密过程通常还需要配合其他安全措施,比如使用随机生成的密钥、密钥的妥善存储和传输、消息认证码(MAC)以验证数据完整性等。此外,非对称加密通常用于初始化对称加密的密钥,这样可以结合...
国密SM4算法是一种在中国广泛使用的对称加密算法,它主要设计用于满足我国信息安全领域的特殊需求...通过这个项目,开发者不仅可以学习到SM4算法的使用,还能深入理解加密解密流程,以及如何在实际项目中应用这些技术。
Java加密解密是一个重要的安全领域,它涉及到保护数据的隐私和完整性。在Java中,我们可以使用内置的Java Cryptography Extension (JCE) 来实现加密和解密操作。本资源包含源码,使得开发者能够更深入地理解加密解密...
这些知识点在提供的Java加密解密工具包中可能有所体现,通过这些工具,开发者可以轻松地集成安全功能到他们的应用程序中,确保数据的安全传输和存储。理解并熟练运用这些概念,有助于构建更健壮和安全的Java系统。
在给定的标题“C#程序Mac地址AES加密及解密”中,我们关注的核心知识点是利用C#编程语言处理硬件标识,特别是Mac地址,并且结合了高级加密标准(AES)进行数据的安全传输与存储。 Mac地址,全称为Media Access ...
通过阅读这本书和研究源码,开发者不仅可以掌握Java加密技术的基础,还能提升对网络安全的理解,这对于开发安全的应用程序或系统至关重要。无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的专业技能。...
Java加密解密工具集是Java开发中非常关键的一部分,它涉及到数据安全、隐私保护以及通信过程中的信息保密性。在Java编程中,我们经常会遇到需要对数据进行加密和解密的情况,例如存储用户敏感信息、网络传输过程中的...
综上所述,Java文件加密解密涉及多种技术和概念,包括选择合适的加密算法、管理密钥、处理文件流、确保数据完整性和安全性等。通过理解并正确应用这些知识点,可以构建出强大的文件加密和解密系统。
### Java加密解密方法大全 #### 1. 加密概述 **1.1 加密的应用** 随着信息技术的发展,数据安全成为越来越重要的问题。加密技术作为一种有效的保护数据安全的方法,在各个领域得到了广泛的应用。例如,在互联网...
《JAVA加密与解密的艺术第2版》是一本深度探讨Java平台上的安全加密与解密技术的专业书籍。在数字化时代,信息安全成为了至关重要的问题,而加密技术是保护数据隐私、确保网络通信安全的重要手段。本书作为良心之作...
总的来说,Java字符串加密解密涉及到多个层面的知识,包括加密算法、密钥管理、安全协议等。理解和熟练掌握这些技术对于保障网络安全至关重要。在实际开发中,还需要关注加密算法的版本限制、密钥的安全存储以及法律...
在这个项目中,JAVA被用来实现核心的加密解密算法以及图形化界面。 2. **文件加密**:文件加密是通过将原始数据转换成看似随机且不可读的形式,以防止未经授权的访问。这个程序可能采用了对称加密(如AES,DES)或...
Java加密解密工具集是Java开发中不可或缺的一部分,它提供了对数据进行安全处理的能力,确保信息在传输或存储过程中的隐私性和完整性。JCT(Java Cryptography Toolkit)可能是指Java提供的加密工具包,用于实现各种...
8. **Java加密API详解**:`javax.crypto`包是Java加密的核心,书中将详细解析其提供的加密服务,如Cipher类用于加密解密操作,KeyGenerator用于密钥生成,KeyPairGenerator用于非对称密钥对的生成等。 9. **源代码...
综上所述,这个资源集合提供了一套强大的Java加密解密算法源码,涵盖了多种加密方法,同时支持生成ZIP压缩文件。开发者可以学习并利用这些源码来增强应用程序的安全性,保护用户数据免受非法访问。
Java加密算法及原理是信息安全领域中的重要组成部分,用于保护数据的隐私性和完整性。在Java中,我们可以使用多种加密算法来实现数据的安全传输和存储。以下将详细介绍几种常见的Java加密算法及其工作原理。 1. **...