一、简述
mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也经常被称作HMAC算法。关于hmac算法的详情可以参看RFC 2104(http://www.ietf.org/rfc/rfc2104.txt),这里包含了HmacMD5算法的C语言实现。
这里需要说明的是经过mac算法得到的摘要值也可以使用十六进制编码表示,其摘要值得长度与实现算法的摘要值长度相同。例如 HmacSHA算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制数,换算成十六进制的编码为40位。
二、模型分析
甲乙双方进行数据交换可以采取如下流程完成
1、甲方向乙方公布摘要算法(就是指定要使用的摘要算法名)
2、甲乙双方按照约定构造密钥,双方拥有相同的密钥(一般是一方构造密钥后通知另外一方,此过程不需要通过程序实现,就是双方约定个字符串,但是这个字符串可不是随便设定的,也是通过相关算法获取的)
3、甲方使用密钥对消息做摘要处理,然后将消息和生成的摘要消息一同发送给乙方
4、乙方收到消息后,使用甲方已经公布的摘要算法+约定好的密钥 对收到的消息进行摘要处理。然后比对自己的摘要消息和甲方发过来的摘要消息。甄别消息是否是甲方发送过来的
三、MAC系列算法支持表
算法 | 摘要长度 | 备注 |
HmacMD5 | 128 | JAVA6实现 |
HmacSHA1 | 160 | JAVA6实现 |
HmacSHA256 | 256 | JAVA6实现 |
HmacSHA384 | 384 | JAVA6实现 |
HmacSHA512 | 512 | JAVA6实现 |
HmacMD2 | 128 | BouncyCastle实现 |
HmacMD4 | 128 | BouncyCastle实现 |
HmacSHA224 | 224 | BouncyCastle实现 |
四、sun以及bouncycastle的hmac算法实现
import java.security.Security; import javax.crypto.KeyGenerator; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; /** * MAC消息摘要组件 * @author kongqz * */ public class MACCoder { ///////////////////////////HmacMD5/////////////////////////////// /** * 初始化HmacMD5的密钥 * @return byte[] 密钥 * * */ public static byte[] initHmacMD5Key() throws Exception{ //初始化KeyGenerator KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacMD5"); //产生密钥 SecretKey secretKey=keyGenerator.generateKey(); //获取密钥 return secretKey.getEncoded(); } /** * HmacMD5消息摘要 * @param data 待做摘要处理的数据 * @param key 密钥 * @return byte[] 消息摘要 * */ public static byte[] encodeHmacMD5(byte[] data,byte[] key) throws Exception{ //还原密钥,因为密钥是以byte形式为消息传递算法所拥有 SecretKey secretKey=new SecretKeySpec(key,"HmacMD5"); //实例化Mac Mac mac=Mac.getInstance(secretKey.getAlgorithm()); //初始化Mac mac.init(secretKey); //执行消息摘要处理 return mac.doFinal(data); } ///////////////////////////////HmacSHA1////////////////////////////////// /** * 初始化HmacSHA1的密钥 * @return byte[] 密钥 * * */ public static byte[] initHmacSHAKey() throws Exception{ //初始化KeyGenerator KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA1"); //产生密钥 SecretKey secretKey=keyGenerator.generateKey(); //获取密钥 return secretKey.getEncoded(); } /** * HmacSHA1消息摘要 * @param data 待做摘要处理的数据 * @param key 密钥 * @return byte[] 消息摘要 * */ public static byte[] encodeHmacSHA(byte[] data,byte[] key) throws Exception{ //还原密钥,因为密钥是以byte形式为消息传递算法所拥有 SecretKey secretKey=new SecretKeySpec(key,"HmacSHA1"); //实例化Mac Mac mac=Mac.getInstance(secretKey.getAlgorithm()); //初始化Mac mac.init(secretKey); //执行消息摘要处理 return mac.doFinal(data); } ///////////////////////////////HmacSHA256////////////////////////////////// /** * 初始化HmacSHA256的密钥 * @return byte[] 密钥 * * */ public static byte[] initHmacSHA256Key() throws Exception{ //初始化KeyGenerator KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA256"); //产生密钥 SecretKey secretKey=keyGenerator.generateKey(); //获取密钥 return secretKey.getEncoded(); } /** * HmacSHA256消息摘要 * @param data 待做摘要处理的数据 * @param key 密钥 * @return byte[] 消息摘要 * */ public static byte[] encodeHmacSHA256(byte[] data,byte[] key) throws Exception{ //还原密钥,因为密钥是以byte形式为消息传递算法所拥有 SecretKey secretKey=new SecretKeySpec(key,"HmacSHA256"); //实例化Mac Mac mac=Mac.getInstance(secretKey.getAlgorithm()); //初始化Mac mac.init(secretKey); //执行消息摘要处理 return mac.doFinal(data); } ///////////////////////////////HmacSHA384////////////////////////////////// /** * 初始化HmacSHA384的密钥 * @return byte[] 密钥 * * */ public static byte[] initHmacSHA384Key() throws Exception{ //初始化KeyGenerator KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA384"); //产生密钥 SecretKey secretKey=keyGenerator.generateKey(); //获取密钥 return secretKey.getEncoded(); } /** * HmacSHA384消息摘要 * @param data 待做摘要处理的数据 * @param key 密钥 * @return byte[] 消息摘要 * */ public static byte[] encodeHmacSHA384(byte[] data,byte[] key) throws Exception{ //还原密钥,因为密钥是以byte形式为消息传递算法所拥有 SecretKey secretKey=new SecretKeySpec(key,"HmacSHA384"); //实例化Mac Mac mac=Mac.getInstance(secretKey.getAlgorithm()); //初始化Mac mac.init(secretKey); //执行消息摘要处理 return mac.doFinal(data); } ///////////////////////////////HmacSHA512////////////////////////////////// /** * 初始化HmacSHA512的密钥 * @return byte[] 密钥 * * */ public static byte[] initHmacSHA512Key() throws Exception{ //初始化KeyGenerator KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA512"); //产生密钥 SecretKey secretKey=keyGenerator.generateKey(); //获取密钥 return secretKey.getEncoded(); } /** * HmacSHA512消息摘要 * @param data 待做摘要处理的数据 * @param key 密钥 * @return byte[] 消息摘要 * */ public static byte[] encodeHmacSHA512(byte[] data,byte[] key) throws Exception{ //还原密钥,因为密钥是以byte形式为消息传递算法所拥有 SecretKey secretKey=new SecretKeySpec(key,"HmacSHA512"); //实例化Mac Mac mac=Mac.getInstance(secretKey.getAlgorithm()); //初始化Mac mac.init(secretKey); //执行消息摘要处理 return mac.doFinal(data); } ///////////////////////////////HmacMD2-BouncyCastle才支持的实现////////////////////////////////// /** * 初始化HmacMD2的密钥 * @return byte[] 密钥 * */ public static byte[] initHmacMD2Key() throws Exception{ //加入BouncyCastleProvider的支持 Security.addProvider(new BouncyCastleProvider()); //初始化KeyGenerator KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacMD2"); //产生密钥 SecretKey secretKey=keyGenerator.generateKey(); //获取密钥 return secretKey.getEncoded(); } /** * HmacMD2消息摘要 * @param data 待做摘要处理的数据 * @param key 密钥 * @return byte[] 消息摘要 * */ public static byte[] encodeHmacMD2(byte[] data,byte[] key) throws Exception{ //加入BouncyCastleProvider的支持 Security.addProvider(new BouncyCastleProvider()); //还原密钥,因为密钥是以byte形式为消息传递算法所拥有 SecretKey secretKey=new SecretKeySpec(key,"HmacMD2"); //实例化Mac Mac mac=Mac.getInstance(secretKey.getAlgorithm()); //初始化Mac mac.init(secretKey); //执行消息摘要处理 return mac.doFinal(data); } /** * HmacMD2Hex消息摘要 * @param data 待做消息摘要处理的数据 * @param String 密钥 * @return byte[] 消息摘要 * */ public static String encodeHmacMD2Hex(byte[] data,byte[] key) throws Exception{ //执行消息摘要处理 byte[] b=encodeHmacMD2(data,key); //做十六进制转换 return new String(Hex.encode(b)); } ///////////////////////////////HmacMD4-BouncyCastle才支持的实现////////////////////////////////// /** * 初始化HmacMD2的密钥 * @return byte[] 密钥 * */ public static byte[] initHmacMD4Key() throws Exception{ //加入BouncyCastleProvider的支持 Security.addProvider(new BouncyCastleProvider()); //初始化KeyGenerator KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacMD4"); //产生密钥 SecretKey secretKey=keyGenerator.generateKey(); //获取密钥 return secretKey.getEncoded(); } /** * HmacMD4消息摘要 * @param data 待做摘要处理的数据 * @param key 密钥 * @return byte[] 消息摘要 * */ public static byte[] encodeHmacMD4(byte[] data,byte[] key) throws Exception{ //加入BouncyCastleProvider的支持 Security.addProvider(new BouncyCastleProvider()); //还原密钥,因为密钥是以byte形式为消息传递算法所拥有 SecretKey secretKey=new SecretKeySpec(key,"HmacMD4"); //实例化Mac Mac mac=Mac.getInstance(secretKey.getAlgorithm()); //初始化Mac mac.init(secretKey); //执行消息摘要处理 return mac.doFinal(data); } /** * HmacMD4Hex消息摘要 * @param data 待做消息摘要处理的数据 * @param String 密钥 * @return byte[] 消息摘要 * */ public static String encodeHmacMD4Hex(byte[] data,byte[] key) throws Exception{ //执行消息摘要处理 byte[] b=encodeHmacMD4(data,key); //做十六进制转换 return new String(Hex.encode(b)); } ///////////////////////////////HmacSHA224-BouncyCastle才支持的实现////////////////////////////////// /** * 初始化HmacSHA224的密钥 * @return byte[] 密钥 * */ public static byte[] initHmacSHA224Key() throws Exception{ //加入BouncyCastleProvider的支持 Security.addProvider(new BouncyCastleProvider()); //初始化KeyGenerator KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA224"); //产生密钥 SecretKey secretKey=keyGenerator.generateKey(); //获取密钥 return secretKey.getEncoded(); } /** * HmacSHA224消息摘要 * @param data 待做摘要处理的数据 * @param key 密钥 * @return byte[] 消息摘要 * */ public static byte[] encodeHmacSHA224(byte[] data,byte[] key) throws Exception{ //加入BouncyCastleProvider的支持 Security.addProvider(new BouncyCastleProvider()); //还原密钥,因为密钥是以byte形式为消息传递算法所拥有 SecretKey secretKey=new SecretKeySpec(key,"HmacSHA224"); //实例化Mac Mac mac=Mac.getInstance(secretKey.getAlgorithm()); //初始化Mac mac.init(secretKey); //执行消息摘要处理 return mac.doFinal(data); } /** * HmacSHA224Hex消息摘要 * @param data 待做消息摘要处理的数据 * @param String 密钥 * @return byte[] 消息摘要 * */ public static String encodeHmacSHA224Hex(byte[] data,byte[] key) throws Exception{ //执行消息摘要处理 byte[] b=encodeHmacSHA224(data,key); //做十六进制转换 return new String(Hex.encode(b)); } /** * 进行相关的摘要算法的处理展示 * @throws Exception * **/ public static void main(String[] args) throws Exception { String str="HmacMD5消息摘要"; //初始化密钥 byte[] key1=MACCoder.initHmacMD5Key(); //获取摘要信息 byte[] data1=MACCoder.encodeHmacMD5(str.getBytes(), key1); System.out.println("原文:"+str); System.out.println(); System.out.println("HmacMD5的密钥:"+key1.toString()); System.out.println("HmacMD5算法摘要:"+data1.toString()); System.out.println(); //初始化密钥 byte[] key2=MACCoder.initHmacSHA256Key(); //获取摘要信息 byte[] data2=MACCoder.encodeHmacSHA256(str.getBytes(), key2); System.out.println("HmacSHA256的密钥:"+key2.toString()); System.out.println("HmacSHA256算法摘要:"+data2.toString()); System.out.println(); //初始化密钥 byte[] key3=MACCoder.initHmacSHAKey(); //获取摘要信息 byte[] data3=MACCoder.encodeHmacSHA(str.getBytes(), key3); System.out.println("HmacSHA1的密钥:"+key3.toString()); System.out.println("HmacSHA1算法摘要:"+data3.toString()); System.out.println(); //初始化密钥 byte[] key4=MACCoder.initHmacSHA384Key(); //获取摘要信息 byte[] data4=MACCoder.encodeHmacSHA384(str.getBytes(), key4); System.out.println("HmacSHA384的密钥:"+key4.toString()); System.out.println("HmacSHA384算法摘要:"+data4.toString()); System.out.println(); //初始化密钥 byte[] key5=MACCoder.initHmacSHA512Key(); //获取摘要信息 byte[] data5=MACCoder.encodeHmacSHA512(str.getBytes(), key5); System.out.println("HmacSHA512的密钥:"+key5.toString()); System.out.println("HmacSHA512算法摘要:"+data5.toString()); System.out.println(); System.out.println("================以下的算法支持是bouncycastle支持的算法,sun java6不支持======================="); //初始化密钥 byte[] key6=MACCoder.initHmacMD2Key(); //获取摘要信息 byte[] data6=MACCoder.encodeHmacMD2(str.getBytes(), key6); String datahex6=MACCoder.encodeHmacMD2Hex(str.getBytes(), key6); System.out.println("Bouncycastle HmacMD2的密钥:"+key6.toString()); System.out.println("Bouncycastle HmacMD2算法摘要:"+data6.toString()); System.out.println("Bouncycastle HmacMD2Hex算法摘要:"+datahex6.toString()); System.out.println(); //初始化密钥 byte[] key7=MACCoder.initHmacMD4Key(); //获取摘要信息 byte[] data7=MACCoder.encodeHmacMD4(str.getBytes(), key7); String datahex7=MACCoder.encodeHmacMD4Hex(str.getBytes(), key7); System.out.println("Bouncycastle HmacMD4的密钥:"+key7.toString()); System.out.println("Bouncycastle HmacMD4算法摘要:"+data7.toString()); System.out.println("Bouncycastle HmacMD4Hex算法摘要:"+datahex7.toString()); System.out.println(); //初始化密钥 byte[] key8=MACCoder.initHmacSHA224Key(); //获取摘要信息 byte[] data8=MACCoder.encodeHmacSHA224(str.getBytes(), key8); String datahex8=MACCoder.encodeHmacSHA224Hex(str.getBytes(), key8); System.out.println("Bouncycastle HmacSHA224的密钥:"+key8.toString()); System.out.println("Bouncycastle HmacSHA224算法摘要:"+data8.toString()); System.out.println("Bouncycastle HmacSHA224算法摘要:"+datahex8.toString()); System.out.println(); } }
原文:HmacMD5消息摘要 HmacMD5的密钥:[B@f3d6a5 HmacMD5算法摘要:[B@911f71 HmacSHA256的密钥:[B@1b10d42 HmacSHA256算法摘要:[B@dd87b2 HmacSHA1的密钥:[B@1a0c10f HmacSHA1算法摘要:[B@e2eec8 HmacSHA384的密钥:[B@67ac19 HmacSHA384算法摘要:[B@53ba3d HmacSHA512的密钥:[B@1813fac HmacSHA512算法摘要:[B@7b7072 ================以下的算法支持是bouncycastle支持的算法,sun java6不支持======================= Bouncycastle HmacMD2的密钥:[B@1e4457d Bouncycastle HmacMD2算法摘要:[B@18e2b22 Bouncycastle HmacMD2Hex算法摘要:103403efad9df90180d9c5528060950e Bouncycastle HmacMD4的密钥:[B@efd552 Bouncycastle HmacMD4算法摘要:[B@19dfbff Bouncycastle HmacMD4Hex算法摘要:9afc6aba973434b4092c9c4840dd0e41 Bouncycastle HmacSHA224的密钥:[B@16cd7d5 Bouncycastle HmacSHA224算法摘要:[B@cdedfd Bouncycastle HmacSHA224算法摘要:293398d4bb063705dd2007be210022f40f34fb445fe4c1318ce4a550
五、总结
1、sun支持了5中算法,但是不支持转成16进制,但是可以用commons codec或者bouncycastle的16进制转换协助进行转换
2、bouncycastle支持补充了三种算法,并支持16进制转换
相关推荐
java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...
5. **消息认证码(MAC)**:如HMAC(Hash-based Message Authentication Code),结合了哈希函数和密钥,用于验证数据的完整性和来源。 这些源码可以帮助开发者更好地理解各种加密机制的工作原理,并在实际项目中...
本篇文章将深入探讨三种常见的MAC算法:PBOC_3DES_MAC、ANSI X9.9 MAC算法以及ANSI X9.19 MAC算法,并通过提供的Java源码文件(DesUtils.java、ANSIMacUtils.java、Pboc3DesMACUtils.java)来解析它们的实现细节。...
本文详解了Java中消息摘要算法MAC(Message Authentication Code)的实现方法,这是消息摘要算法的第三种实现方式,前两种分别是MD2、MD4、MD5以及SHA系列算法。消息摘要算法主要用于确保信息传输完整性和认证,MAC...
消息认证码(Message Authentication Code,MAC)是一种用于验证数据完整性和来源的机制,它是通过一个密钥和哈希函数生成的固定长度的摘要。MAC与普通的哈希函数不同,因为它需要共享的密钥,这使得只有拥有正确...
Java 消息摘要算法 MAC 实现与应用完整示例 Java 消息摘要算法 MAC(Message Authentication Code)是一种用于数据完整性和身份验证的算法。它可以确保数据的完整性和一致性,防止数据被篡改或伪造。 概念: * ...
MAC算法之消息摘要算法HmacMD5的实现 MAC(Message Authentication Code,消息验证码)算法是一种常用的消息认证机制,它可以确保消息的完整性和真实性。在实际应用中,MAC算法通常与加密算法结合使用,以确保消息...
它通过将一个密钥与消息结合,生成一个固定长度的摘要,这个摘要称为MAC值。MAC算法通常用于网络通信、文件完整性检查以及数据库保护等领域,确保信息在传输过程中没有被篡改或伪造。 在提供的"MAC算法小工具"中,...
03.多算法支持: 提供MD5, SHA系列等十几种消息摘要算法(Microsoft Windows®平台视用户安装选项而定), 可满足绝大多数常规用户的需求 04.多外观支持: 提供系统和jgoodies、substance等二十余种主题(theme)[和/或]...
MAC是通过一个密钥和一个消息来生成固定长度的摘要,这个摘要与原始消息绑定,使得任何对消息的修改在计算新的MAC时都会被发现。在本文中,我们将深入探讨DES-MAC的工作原理、特点以及其在实际应用中的重要性。 **...
03.多算法支持: 提供MD5, SHA系列等十几种消息摘要算法(Microsoft Windows®平台视用户安装选项而定), 可满足绝大多数常规用户的需求 04.多外观支持: 提供系统和jgoodies、substance等二十余种主题(theme)[和/或]...
03.多算法支持: 提供MD5, SHA系列等十几种消息摘要算法(Microsoft Windows®平台视用户安装选项而定), 可满足绝大多数常规用户的需求 04.多外观支持: 提供系统和jgoodies、substance等二十余种主题(theme)[和/或]...
包含java加解密算法(base64,des,3des,aes,pbe,dh,rsa,ElGamal) 包含java摘要算法(md2,md4,md5,sha1,sha2((SHA-224,SHA-256, SHA-384,SHA-512)),mac) 包含签名算法(rsa,dsa,ecdsa)
摘要算法将任意长度的输入(如文本、图片或文件)转换为固定长度的输出,这个输出称为摘要,它具有不可逆性,即不能通过摘要恢复原始信息。以下是几种常见的摘要算法: 1. **Hex编码**: - Hex编码是一种将二进制...
AES-CMAC是一种基于AES(Advanced Encryption Standard)的密码消息认证码(MAC)算法,用于确保数据的完整性和来源的真实性。AES是由NIST(美国国家标准与技术研究所)在2001年标准化的一种对称加密算法,它以128位...
哈希算法,也称为散列函数或消息摘要,是一种单向函数,它将任意长度的输入(通常称为预映射或消息)转换为固定长度的输出,这个输出就是哈希值。哈希算法的主要特性包括不可逆性、抗碰撞性和高效性。不可逆性意味着...
本实验涵盖了多个关键的密码学概念和技术,包括Hash算法的MD5、DES-CBC模式、基于口令的加密、CBC-MAC消息认证码、数字信封、数字签名以及Diffie-Hellman(DH)密钥交换协议。下面将对这些知识点进行详细阐述。 1. ...
03.多算法支持: 提供MD5, SHA系列等十几种消息摘要算法(Microsoft Windows®平台视用户安装选项而定), 可满足绝大多数常规用户的需求 04.多外观支持: 提供系统和jgoodies、substance等二十余种主题(theme)[和/或]...
### MD5摘要算法 MD5(Message Digest algorithm 5)是一种广泛使用的散列函数,用于生成固定长度的128位(16字节)消息摘要。这种摘要通常用来验证数据的完整性和一致性,例如在网络传输中校验文件是否被篡改。MD5...
接下来,文档中多次提到了MD5(消息摘要算法第五版)。MD5是一种广泛使用的哈希函数,它能够产生出一个128位的哈希值(通常用32位十六进制数表示)。MD5曾经被广泛应用于数据完整性校验,但现在已经不推荐使用,因为...