JAVA加密解密之消息认证码算法(Message Authentication Code,MAC)
2016-12-02 19:05
204 查看
消息认证码算法简介
在密码学中,消息认证码(英语:Message authentication code,缩写为MAC),又译为消息鉴别码、文件消息认证码、讯息鉴别码、信息认证码,是经过特定算法后产生的一小段信息,检查某段消息的完整性,以及作身份验证。它可以用来检查在消息传递过程中,其内容是否被更改过,不管更改的原因是来自意外或是蓄意攻击。同时可以作为消息来源的身份验证,确认消息的来源。消息认证码的算法中,通常会使用使用带密钥的散列函数,或者块密码的带认证工作模式(如CBC)。
信息鉴别码不能提供对信息的保密,若要同时实现保密认证,同时需要对信息进行加密。
消息认证码算法实现
在Java中支持的消息摘要算法有:HmacMD5、HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512等。package com.jianggujin.codec; import java.security.InvalidKeyException; import javax.crypto.KeyGenerator; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; /** * 消息认证码(Message Authentication Code,MAC)算法 * * @author jianggujin * */ public class HQMac { private static HQMac mac = new HQMac(); public static HQMac getInstance() { return mac; } private HQMac() { } /** * Mac算法 * * @author jianggujin * */ public static enum HQMacAlgorithm { HmacMD5("HmacMD5"), HmacSHA1("HmacSHA1"), HmacSHA224("HmacSHA224"), HmacSHA256("HmacSHA256"), HmacSHA384( "HmacSHA384"), HmacSHA512("HmacSHA512"); private String name; private HQMacAlgorithm(String name) { this.name = name; } public String getName() { return this.name; } } private Mac getMac(String algorithm, byte[] key) throws Exception { Mac mac = Mac.getInstance(algorithm); if (key != null) { try { SecretKey secretKey = new SecretKeySpec(key, algorithm); mac.init(secretKey); } catch (InvalidKeyException e) { throw new IllegalArgumentException(e); } } return mac; } /** * 加密 * * @param algorithm * @param data * @param key * @return */ public byte[] encrypt(HQMacAlgorithm algorithm, byte[] data, byte[] key) throws Exception { return encrypt(algorithm.getName(), data, key); } /** * 加密 * * @param algorithm * @param data * @param key * @return */ public byte[] encrypt(String algorithm, byte[] data, byte[] key) throws Exception { return getMac(algorithm, key).doFinal(data); } /** * 初始化密钥 * * @param algorithm * @return */ public byte[] initKey(HQMacAlgorithm algorithm) throws Exception { return initKey(algorithm.getName()); } /** * 初始化密钥 * * @param algorithm * @return */ public byte[] initKey(String algorithm) throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm); SecretKey secretKey = keyGenerator.generateKey(); return secretKey.getEncoded(); } }
编写测试代码:
import org.junit.Test; import com.jianggujin.codec.HQHex; import com.jianggujin.codec.HQMac; import com.jianggujin.codec.HQMac.HQMacAlgorithm; public class MacTest { HQMac mac = HQMac.getInstance(); @Test public void encode() throws Exception { byte[] data = "jianggujin".getBytes(); HQMacAlgorithm[] algorithms = HQMacAlgorithm.values(); for (HQMacAlgorithm algorithm : algorithms) { byte[] key = mac.initKey(algorithm); System.err.println(algorithm + ":" + HQHex.encodeHexString(mac.encrypt(algorithm, data, key))); } } }
运行结果如下:
HmacMD5:891E44A3A4CB842AE6BDDA54178CA617
HmacSHA1:03A993483DF38ED65EC51F454C7FB1EEA6D3F61A
HmacSHA224:3993CA6F537F812676F0E5F5B15E9A8CFA8C9238DF9AAFFEF5CE218F
HmacSHA256:56C7F9E414DB865694C984A4B931041A8508C9E341518061E1E0690F7DE2EFC8
HmacSHA384:765CD8680BDEDA703679EE5B0619DD07C1109A8DCA6EF984A88E7EDF00C52C244E26A6A0EB2DE4BDB2B91274FE44CF22
HmacSHA512:2D4439A91C16A6BBACE449582B3FAD2DE4ACF19E9BED4E09791D3C112A4175E16F1C500B1CD01338F2E8479A7024D5FF28577E3BE0D38E3424A5DAC8F0BC0122
相关文章推荐
- 第四十七篇: JAVA加密解密之消息认证码算法(Message Authentication Code,MAC)
- MAC (Message Authentication Code,消息认证码算法)
- Java加密解密之MAC(消息认证码)
- RSA算法简单实现加密、解密、签名、验证(原创Java程序)
- java中的使用RSA算法进行公钥加密私钥解密
- Java: 如何加密解密 How to encrypt and decrypt
- 用java常用加密,解密,数字签名等常用API
- Java使用AES加密和解密的实例详解
- 用java常用加密,解密,数字签名等常用API
- Java - 简单加密-解密方法包装, 含encode(),decode(),md5()
- Java中对字符串进行加密和解密(转)
- RC4加密解密source code(C code)
- WDSsoft免费源代码,java加密解密编程常用工具包 JCT 1.0 (整理)
- Java与.Net环境下RSA加密解密交互不成功的问题解决
- Java与.Net环境下RSA加密解密交互不成功的问题解决【续】
- java EJB 加密与解密原理的一个例子
- 加密解密。(aes, java)
- 解密XenoCode加密的字符串
- Java中对字符串进行加密和解密
- 简单的使用FormsAuthenticationTicket来加密解密