`

java加密解密研究8、MAC算法家族

阅读更多

一、概述

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)、执行消息摘要

 

[java] view plaincopy
 
  1. package com.tao.test;  
  2.   
  3. import java.security.NoSuchAlgorithmException;  
  4.   
  5. import javax.crypto.KeyGenerator;  
  6. import javax.crypto.Mac;  
  7. import javax.crypto.SecretKey;  
  8. import javax.crypto.spec.SecretKeySpec;  
  9. import javax.xml.bind.annotation.adapters.HexBinaryAdapter;  
  10.   
  11. /** 
  12.  * MAC算法工具类 
  13.  * 对于HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512应用的步骤都是一模一样的。具体看下面的代码 
  14.  */  
  15. class MACCoder {  
  16.     /** 
  17.      * 产生HmacMD5摘要算法的密钥 
  18.      */  
  19.     public static byte[] initHmacMD5Key() throws NoSuchAlgorithmException {  
  20.         // 初始化HmacMD5摘要算法的密钥产生器  
  21.         KeyGenerator generator = KeyGenerator.getInstance("HmacMD5");  
  22.         // 产生密钥  
  23.         SecretKey secretKey = generator.generateKey();  
  24.         // 获得密钥  
  25.         byte[] key = secretKey.getEncoded();  
  26.         return key;  
  27.     }  
  28.   
  29.     /** 
  30.      * HmacMd5摘要算法 
  31.      * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥 
  32.      */  
  33.     public static String encodeHmacMD5(byte[] data, byte[] key) throws Exception {  
  34.         // 还原密钥  
  35.         SecretKey secretKey = new SecretKeySpec(key, "HmacMD5");  
  36.         // 实例化Mac  
  37.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  38.         //初始化mac  
  39.         mac.init(secretKey);  
  40.         //执行消息摘要  
  41.         byte[] digest = mac.doFinal(data);  
  42.         return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串  
  43.     }  
  44.       
  45.       
  46.     /** 
  47.      * 产生HmacSHA1摘要算法的密钥 
  48.      */  
  49.     public static byte[] initHmacSHAKey() throws NoSuchAlgorithmException {  
  50.         // 初始化HmacMD5摘要算法的密钥产生器  
  51.         KeyGenerator generator = KeyGenerator.getInstance("HmacSHA1");  
  52.         // 产生密钥  
  53.         SecretKey secretKey = generator.generateKey();  
  54.         // 获得密钥  
  55.         byte[] key = secretKey.getEncoded();  
  56.         return key;  
  57.     }  
  58.   
  59.     /** 
  60.      * HmacSHA1摘要算法 
  61.      * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥 
  62.      */  
  63.     public static String encodeHmacSHA(byte[] data, byte[] key) throws Exception {  
  64.         // 还原密钥  
  65.         SecretKey secretKey = new SecretKeySpec(key, "HmacSHA1");  
  66.         // 实例化Mac  
  67.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  68.         //初始化mac  
  69.         mac.init(secretKey);  
  70.         //执行消息摘要  
  71.         byte[] digest = mac.doFinal(data);  
  72.         return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串  
  73.     }  
  74.       
  75.       
  76.       
  77.     /** 
  78.      * 产生HmacSHA256摘要算法的密钥 
  79.      */  
  80.     public static byte[] initHmacSHA256Key() throws NoSuchAlgorithmException {  
  81.         // 初始化HmacMD5摘要算法的密钥产生器  
  82.         KeyGenerator generator = KeyGenerator.getInstance("HmacSHA256");  
  83.         // 产生密钥  
  84.         SecretKey secretKey = generator.generateKey();  
  85.         // 获得密钥  
  86.         byte[] key = secretKey.getEncoded();  
  87.         return key;  
  88.     }  
  89.   
  90.     /** 
  91.      * HmacSHA1摘要算法 
  92.      * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥 
  93.      */  
  94.     public static String encodeHmacSHA256(byte[] data, byte[] key) throws Exception {  
  95.         // 还原密钥  
  96.         SecretKey secretKey = new SecretKeySpec(key, "HmacSHA256");  
  97.         // 实例化Mac  
  98.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  99.         //初始化mac  
  100.         mac.init(secretKey);  
  101.         //执行消息摘要  
  102.         byte[] digest = mac.doFinal(data);  
  103.         return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串  
  104.     }  
  105.       
  106.       
  107.   
  108.     /** 
  109.      * 产生HmacSHA256摘要算法的密钥 
  110.      */  
  111.     public static byte[] initHmacSHA384Key() throws NoSuchAlgorithmException {  
  112.         // 初始化HmacMD5摘要算法的密钥产生器  
  113.         KeyGenerator generator = KeyGenerator.getInstance("HmacSHA384");  
  114.         // 产生密钥  
  115.         SecretKey secretKey = generator.generateKey();  
  116.         // 获得密钥  
  117.         byte[] key = secretKey.getEncoded();  
  118.         return key;  
  119.     }  
  120.   
  121.     /** 
  122.      * HmacSHA1摘要算法 
  123.      * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥 
  124.      */  
  125.     public static String encodeHmacSHA384(byte[] data, byte[] key) throws Exception {  
  126.         // 还原密钥  
  127.         SecretKey secretKey = new SecretKeySpec(key, "HmacSHA384");  
  128.         // 实例化Mac  
  129.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  130.         //初始化mac  
  131.         mac.init(secretKey);  
  132.         //执行消息摘要  
  133.         byte[] digest = mac.doFinal(data);  
  134.         return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串  
  135.     }  
  136.       
  137.       
  138.   
  139.     /** 
  140.      * 产生HmacSHA256摘要算法的密钥 
  141.      */  
  142.     public static byte[] initHmacSHA512Key() throws NoSuchAlgorithmException {  
  143.         // 初始化HmacMD5摘要算法的密钥产生器  
  144.         KeyGenerator generator = KeyGenerator.getInstance("HmacSHA512");  
  145.         // 产生密钥  
  146.         SecretKey secretKey = generator.generateKey();  
  147.         // 获得密钥  
  148.         byte[] key = secretKey.getEncoded();  
  149.         return key;  
  150.     }  
  151.   
  152.     /** 
  153.      * HmacSHA1摘要算法 
  154.      * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥 
  155.      */  
  156.     public static String encodeHmacSHA512(byte[] data, byte[] key) throws Exception {  
  157.         // 还原密钥  
  158.         SecretKey secretKey = new SecretKeySpec(key, "HmacSHA512");  
  159.         // 实例化Mac  
  160.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  161.         //初始化mac  
  162.         mac.init(secretKey);  
  163.         //执行消息摘要  
  164.         byte[] digest = mac.doFinal(data);  
  165.         return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串  
  166.     }  
  167. }  
  168.   
  169. public class MACTest {  
  170.     public static void main(String[] args) throws Exception {  
  171.         String testString = "asdasd";  
  172.           
  173.         byte[] keyHmacMD5=MACCoder.initHmacMD5Key();  
  174.         System.out.println(MACCoder.encodeHmacMD5(testString.getBytes(),keyHmacMD5));  
  175.           
  176.         byte[] keyHmacSHA1=MACCoder.initHmacSHAKey();  
  177.         System.out.println(MACCoder.encodeHmacSHA(testString.getBytes(),keyHmacSHA1));  
  178.           
  179.         byte[] keyHmacSHA256=MACCoder.initHmacSHA256Key();  
  180.         System.out.println(MACCoder.encodeHmacSHA256(testString.getBytes(),keyHmacSHA256));  
  181.           
  182.         byte[] keyHmacSHA384=MACCoder.initHmacSHA384Key();  
  183.         System.out.println(MACCoder.encodeHmacSHA384(testString.getBytes(),keyHmacSHA384));  
  184.           
  185.         byte[] keyHmacSHA512=MACCoder.initHmacSHA512Key();  
  186.         System.out.println(MACCoder.encodeHmacSHA512(testString.getBytes(),keyHmacSHA512));  
  187.     }  
  188. }  

 

 

 

2、BouncyCastle的实现和应用

第三方加密组件包Bouncy Castle作为补充,提供了HmacMD2.HmacMD4、HmacSHA224三种算法的支持。

 

[java] view plaincopy
 
  1. package Test;  
  2.   
  3. import java.security.NoSuchAlgorithmException;  
  4. import java.security.Security;  
  5.   
  6. import javax.crypto.KeyGenerator;  
  7. import javax.crypto.Mac;  
  8. import javax.crypto.SecretKey;  
  9. import javax.crypto.spec.SecretKeySpec;  
  10. import javax.xml.bind.annotation.adapters.HexBinaryAdapter;  
  11.   
  12. import org.bouncycastle.jce.provider.BouncyCastleProvider;  
  13.   
  14. /** 
  15.  * MAC算法工具类 
  16.  * 对于HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512应用的步骤都是一模一样的。具体看下面的代码 
  17.  */  
  18. class MACCoder {  
  19.     /** 
  20.      * 产生HmacMD2摘要算法的密钥 
  21.      */  
  22.     public static byte[] initHmacMD2Key() throws NoSuchAlgorithmException {  
  23.         // 添加BouncyCastle的支持  
  24.         Security.addProvider(new BouncyCastleProvider());  
  25.         // 初始化HmacMD5摘要算法的密钥产生器  
  26.         KeyGenerator generator = KeyGenerator.getInstance("HmacMD2");  
  27.         // 产生密钥  
  28.         SecretKey secretKey = generator.generateKey();  
  29.         // 获得密钥  
  30.         byte[] key = secretKey.getEncoded();  
  31.         return key;  
  32.     }  
  33.   
  34.     /** 
  35.      * HmacMd2摘要算法 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥 
  36.      */  
  37.     public static String encodeHmacMD2(byte[] data, byte[] key) throws Exception {  
  38.         // 添加BouncyCastle的支持  
  39.         Security.addProvider(new BouncyCastleProvider());  
  40.         // 还原密钥  
  41.         SecretKey secretKey = new SecretKeySpec(key, "HmacMD2");  
  42.         // 实例化Mac  
  43.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  44.         // 初始化mac  
  45.         mac.init(secretKey);  
  46.         // 执行消息摘要  
  47.         byte[] digest = mac.doFinal(data);  
  48.         return new HexBinaryAdapter().marshal(digest);// 转为十六进制的字符串  
  49.     }  
  50.   
  51.     /** 
  52.      * 产生HmacMD4摘要算法的密钥 
  53.      */  
  54.     public static byte[] initHmacMD4Key() throws NoSuchAlgorithmException {  
  55.         // 添加BouncyCastle的支持  
  56.         Security.addProvider(new BouncyCastleProvider());  
  57.         // 添加BouncyCastle的支持  
  58.         Security.addProvider(new BouncyCastleProvider());  
  59.         // 初始化HmacMD5摘要算法的密钥产生器  
  60.         KeyGenerator generator = KeyGenerator.getInstance("HmacMD4");  
  61.         // 产生密钥  
  62.         SecretKey secretKey = generator.generateKey();  
  63.         // 获得密钥  
  64.         byte[] key = secretKey.getEncoded();  
  65.         return key;  
  66.     }  
  67.   
  68.     /** 
  69.      * HmacMD4摘要算法 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥 
  70.      */  
  71.     public static String encodeHmacMD4(byte[] data, byte[] key) throws Exception {  
  72.         // 添加BouncyCastle的支持  
  73.         Security.addProvider(new BouncyCastleProvider());  
  74.         // 还原密钥  
  75.         SecretKey secretKey = new SecretKeySpec(key, "HmacMD4");  
  76.         // 实例化Mac  
  77.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  78.         // 初始化mac  
  79.         mac.init(secretKey);  
  80.         // 执行消息摘要  
  81.         byte[] digest = mac.doFinal(data);  
  82.         return new HexBinaryAdapter().marshal(digest);// 转为十六进制的字符串  
  83.     }  
  84.   
  85.     /** 
  86.      * 产生HmacSHA224摘要算法的密钥 
  87.      */  
  88.     public static byte[] initHmacSHA224Key() throws NoSuchAlgorithmException {  
  89.         // 添加BouncyCastle的支持  
  90.         Security.addProvider(new BouncyCastleProvider());  
  91.         // 添加BouncyCastle的支持  
  92.         Security.addProvider(new BouncyCastleProvider());  
  93.         // 初始化HmacMD5摘要算法的密钥产生器  
  94.         KeyGenerator generator = KeyGenerator.getInstance("HmacSHA224");  
  95.         // 产生密钥  
  96.         SecretKey secretKey = generator.generateKey();  
  97.         // 获得密钥  
  98.         byte[] key = secretKey.getEncoded();  
  99.         return key;  
  100.     }  
  101.   
  102.     /** 
  103.      * HmacSHA224摘要算法 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥 
  104.      */  
  105.     public static String encodeHmacSHA224(byte[] data, byte[] key) throws Exception {  
  106.         // 添加BouncyCastle的支持  
  107.         Security.addProvider(new BouncyCastleProvider());  
  108.         // 还原密钥  
  109.         SecretKey secretKey = new SecretKeySpec(key, "HmacSHA224");  
  110.         // 实例化Mac  
  111.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  112.         // 初始化mac  
  113.         mac.init(secretKey);  
  114.         // 执行消息摘要  
  115.         byte[] digest = mac.doFinal(data);  
  116.         return new HexBinaryAdapter().marshal(digest);// 转为十六进制的字符串  
  117.     }  
  118.   
  119. }  
  120.   
  121. public class MACTest {  
  122.     public static void main(String[] args) throws Exception {  
  123.         String testString = "asdasd";  
  124.   
  125.         byte[] keyHmacMD2 = MACCoder.initHmacMD2Key();  
  126.         System.out.println(MACCoder.encodeHmacMD2(testString.getBytes(), keyHmacMD2));  
  127.   
  128.         byte[] keyHmacMD4 = MACCoder.initHmacMD4Key();  
  129.         System.out.println(MACCoder.encodeHmacMD4(testString.getBytes(), keyHmacMD4));  
  130.   
  131.         byte[] keyHmacSHA224 = MACCoder.initHmacSHA224Key();  
  132.         System.out.println(MACCoder.encodeHmacSHA224(testString.getBytes(), keyHmacSHA224));  
  133.     }  
  134. }  
分享到:
评论

相关推荐

    java 实现 des加解密、mac算法

    本文将详细介绍如何在Java中实现DES加解密和MAC算法,并探讨其应用。 首先,DES是一种对称加密算法,由IBM公司开发,后被美国国家标准局采纳为标准。它使用64位的密钥对数据进行加密和解密,但实际有效密钥长度只有...

    很强的Java加密解密算法源码

    在IT行业中,加密和解密是信息安全领域的重要...综上所述,Java加密解密算法源码涵盖了多种安全机制,开发者可以基于这些源码进一步理解并定制自己的加密解决方案。通过深入学习和实践,可以有效提升应用程序的安全性。

    java加密解密算法类_Cipher

    这个"java加密解密算法类_Cipher"可能包含了上述所有或部分知识点的实现,通过阅读源代码,我们可以更深入地理解Java中加密解密的实际应用和细节。在实际开发中,这些知识对于构建安全的网络通信、数据库存储和数据...

    Java加密解密

    Java加密解密是信息安全领域中的一个关键话题,特别是在软件开发中,它对于保护敏感数据、实现安全通信至关重要。Java提供了一系列强大的加密库和API,使得开发者可以方便地进行数据加密和解密操作。本项目提供的...

    java编写的加密解密工具,有对称加密和非对称加密

    为了确保数据安全,加密解密过程通常还需要配合其他安全措施,比如使用随机生成的密钥、密钥的妥善存储和传输、消息认证码(MAC)以验证数据完整性等。此外,非对称加密通常用于初始化对称加密的密钥,这样可以结合...

    国密SM4算法前后端加密解密完整代码.zip

    国密SM4算法是一种在中国广泛使用的对称加密算法,它主要设计用于满足我国信息安全领域的特殊需求...通过这个项目,开发者不仅可以学习到SM4算法的使用,还能深入理解加密解密流程,以及如何在实际项目中应用这些技术。

    Java加密解密(附有源码)

    Java加密解密是一个重要的安全领域,它涉及到保护数据的隐私和完整性。在Java中,我们可以使用内置的Java Cryptography Extension (JCE) 来实现加密和解密操作。本资源包含源码,使得开发者能够更深入地理解加密解密...

    Java开发的多种加密解密工具包

    这些知识点在提供的Java加密解密工具包中可能有所体现,通过这些工具,开发者可以轻松地集成安全功能到他们的应用程序中,确保数据的安全传输和存储。理解并熟练运用这些概念,有助于构建更健壮和安全的Java系统。

    C#程序Mac地址AES加密及解密

    在给定的标题“C#程序Mac地址AES加密及解密”中,我们关注的核心知识点是利用C#编程语言处理硬件标识,特别是Mac地址,并且结合了高级加密标准(AES)进行数据的安全传输与存储。 Mac地址,全称为Media Access ...

    Java加密与解密的艺术PDF和源码

    通过阅读这本书和研究源码,开发者不仅可以掌握Java加密技术的基础,还能提升对网络安全的理解,这对于开发安全的应用程序或系统至关重要。无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的专业技能。...

    Java加密解密工具集+JCT+v1源码整理

    Java加密解密工具集是Java开发中非常关键的一部分,它涉及到数据安全、隐私保护以及通信过程中的信息保密性。在Java编程中,我们经常会遇到需要对数据进行加密和解密的情况,例如存储用户敏感信息、网络传输过程中的...

    Java文件加密解密

    综上所述,Java文件加密解密涉及多种技术和概念,包括选择合适的加密算法、管理密钥、处理文件流、确保数据完整性和安全性等。通过理解并正确应用这些知识点,可以构建出强大的文件加密和解密系统。

    Java加密解密方法大全

    ### Java加密解密方法大全 #### 1. 加密概述 **1.1 加密的应用** 随着信息技术的发展,数据安全成为越来越重要的问题。加密技术作为一种有效的保护数据安全的方法,在各个领域得到了广泛的应用。例如,在互联网...

    JAVA加密与解密的艺术第2版(良心保证第二版)

    《JAVA加密与解密的艺术第2版》是一本深度探讨Java平台上的安全加密与解密技术的专业书籍。在数字化时代,信息安全成为了至关重要的问题,而加密技术是保护数据隐私、确保网络通信安全的重要手段。本书作为良心之作...

    java字符串加密解密

    总的来说,Java字符串加密解密涉及到多个层面的知识,包括加密算法、密钥管理、安全协议等。理解和熟练掌握这些技术对于保障网络安全至关重要。在实际开发中,还需要关注加密算法的版本限制、密钥的安全存储以及法律...

    基于JAVA的简单的文件内容分加密解密(窗口化设计)

    在这个项目中,JAVA被用来实现核心的加密解密算法以及图形化界面。 2. **文件加密**:文件加密是通过将原始数据转换成看似随机且不可读的形式,以防止未经授权的访问。这个程序可能采用了对称加密(如AES,DES)或...

    Java加密解密工具集+JCT+v1Java实用源码整理learns

    Java加密解密工具集是Java开发中不可或缺的一部分,它提供了对数据进行安全处理的能力,确保信息在传输或存储过程中的隐私性和完整性。JCT(Java Cryptography Toolkit)可能是指Java提供的加密工具包,用于实现各种...

    Java加密与解密的艺术PDF

    8. **Java加密API详解**:`javax.crypto`包是Java加密的核心,书中将详细解析其提供的加密服务,如Cipher类用于加密解密操作,KeyGenerator用于密钥生成,KeyPairGenerator用于非对称密钥对的生成等。 9. **源代码...

    很强的Java加密解密算法

    综上所述,这个资源集合提供了一套强大的Java加密解密算法源码,涵盖了多种加密方法,同时支持生成ZIP压缩文件。开发者可以学习并利用这些源码来增强应用程序的安全性,保护用户数据免受非法访问。

    java 加密算法及原理.jar

    Java加密算法及原理是信息安全领域中的重要组成部分,用于保护数据的隐私性和完整性。在Java中,我们可以使用多种加密算法来实现数据的安全传输和存储。以下将详细介绍几种常见的Java加密算法及其工作原理。 1. **...

Global site tag (gtag.js) - Google Analytics