一、概述
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国际desc加密算法,可用于加密机的软加密实现。工具类提供了单双位长的desc加解密算法,同时银联标准mac99的算法
C#程序源码,自己写的小工具,用于获取本机Mac地址,并对Mac地址进行AES加密及解密,已经过测试,方便使用。
可以攻玉1094.1 加固你的系统1094.2 加密组件Bouncy Castle 1114.3 辅助工具...8 应用举例1515.9 小结153第6章验证数据完整性—消息摘要算法1556.1 消息摘要算法简述1556.2 MD算法家族1576.3 SHA算法家族1676.4 MAC算法...
第5章电子邮件传输算法—Base64 134 5.1 Base64算法的由来134 5.2 Base64算法的定义134 5.3 Base64算法与加密算法的关系135 5.4 ...MAC算法家族181 6.5 其他消息摘要算法195 6.6 循环冗余校验算法—CRC算法206 6.7 实例...
包含DES、3DES加解密,MAC加密、ISO9797算法的mac计算(DES.java、ISO9797.java、MAC.java)。也有md5加密、sha-1加密、sha-256加密(EncryptUtil.java)。同时convent.java是对字符串或者byte数组进行处理的类,...
JAVA加密解密算法中,有些PHP 是无法重新翻译并且实现。这个时候可以使用PHP 直接调用jar包 来实现相关加解密的操作! 适用操作系统 MAC LINUX
jce_policy-8,JCE(Java Cryptography Extension)是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现。 它提供对对称、不对称、块和流密码的加密支持,它还支持...
jce_policy-8,JCE(Java Cryptography Extension)是一组包,它们提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现。 它提供对对称、不对称、块和流密码的加密支持,它还...
用Java开发的加密和解密应用程序。 该应用程序使用多种算法来加密和解密HTML源代码: 河豚 AES 茶 兔子 马克4 转义/逃生功能 除了加密和解密功能,该应用程序还返回网站的源代码。 用户可以使用FTP传输功能将加密的...
java笔试题算法 可寻的加密 Seekable Crypto是一个 Java 库,它提供了在SeekableInput查找的能力,同时解密底层内容以及一些用于存储和生成用于加密/解密数据流的密钥的实用程序。 还包括一个 Hadoop 文件系统的实现...
AES加密类别 Python,PHP,C#,Java,C ++,F... 加密的数据包含salt,iv和mac,其格式为:salt [16] + iv [16] +密文[n] + mac [32]。 尽管使用的算法是安全的,但是该密码尚未被专业密码学家修改,因此使用更好地建
EasyJCE 提供了一个易于使用的界面,用于加密、解密和散列数据,以便使用 Java 加密扩展 (JCE) 进行传输或存储。 包含一组 Hibernate 用户类型,以透明地将加密集成到 JPA/Hibernate 环境中的数据层,确保数据以其...
EasyJCE提供了一个易于使用的接口,用于使用Java密码扩展(JCE)进行加密,解密和散列数据以进行传输或存储。 包含一组Hibernate用户类型,以将加密透明地集成到JPA / Hibernate环境中的数据层中,以确保数据以其...
Java流API(CryptoInputStream / CryptoOutputStream)用于高级流加密/解密。 两者均通过高性能AES加密/解密进行了优化。 (现代Xeon处理器中的1400 MB / s-1700 MB / s吞吐量)。 基于JNI的实现可实现与基于...
Ank Zipper为您提供了一个轻量级的,基于Java的应用程序,...它包括AES(高级加密标准)算法来加密/解密文件。 Ank Zipper是一种跨平台软件,可在具有Java兼容性的任何平台(例如Mac OS X,Linux,Windows)上使用。
D.3.5. 关键敏感数据的加密和解密 158 D.4. 安全通道的APDU命令 159 D.4.1. INITIALIZE UPDATE命令 159 D.4.1.1. 定义和范围 159 D.4.1.2. 命令消息 160 D.4.1.3. 引用控制参数P1——密钥版本号 160 D.4.1.4. 引用...
Cell/ⅡMAC/PC抽样设备 INT:中间代码,当一个源程序经过语法检查后编译产生一个可执行代码 IOF:Findit文档 IQY:Microsoft Internet查询文件 ISO:根据ISD 9660有关CD-ROM文件系统标准列出CD-ROM上的文件 ISP...