Java加解密-MAC算法
消息摘要算法——MAC
MAC(Message Authentication Code),兼容了MD和SHA的特性,并且在它们的基础上加入了密钥。因此MAC也称为HMAC(keyed-Hash Message Authentication Code)含有密钥的散列函数算法。
- MD系列:HmacMD2、HmacMD4、HmacMD5
- SHA系列:HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512
例如:常用的Linux客户端SecurityCRT。MAC的算法的提供者如下:
HMAC算法的应用:
Commons Codec中并没有提供Hmac算法的实现。
下面的程序以JDK本身和Bouncy Castle实现了HmacMD5,如果需要实现其他的加密只需要改变相关的参数即可:
============================================================================MAC加解密工具类:
import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Hex; import org.bouncycastle.crypto.digests.MD5Digest; import org.bouncycastle.crypto.macs.HMac; import org.bouncycastle.crypto.params.KeyParameter; public class SecurityMac { /** * MAC(Message Authentication * Code),兼容了MD和SHA的特性,并且在它们的基础上加入了密钥。因此MAC也称为HMAC(keyed-Hash Message * Authentication Code)含有密钥的散列函数算法。 MD系列:HmacMD2、HmacMD4、HmacMD5 * SHA系列:HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512 * 例如:常用的Linux客户端SecurityCRT */ private static String privateKey = "aabbccddee"; /** * HmacMD5加密算法 * @return */ public static String jdkHmacMD5(String src) { byte[] hmacMD5Bytes = null; try { // 1.得到密钥 // KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5"); // SecretKey secretKey = keyGenerator.generateKey();// 生成密钥 // byte[] key = secretKey.getEncoded();//获得密钥 // 2.还原密钥 byte[] privKey = Hex.decodeHex(privateKey.toCharArray()); SecretKey restoreSecretKey = new SecretKeySpec(privKey, "HmacMD5"); // 3.信息摘要 Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());// 实例化mac mac.init(restoreSecretKey);// 初始化mac hmacMD5Bytes = mac.doFinal(src.getBytes());// 执行摘要 } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (DecoderException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } return Hex.encodeHexString(hmacMD5Bytes); } /** * HmacMD5加密算法 * @return */ public static String bouncyCastleHmacMD5(String src) { HMac hmac = new HMac(new MD5Digest()); //生成密钥的时候以aabbccddee为基准 hmac.init(new KeyParameter(org.bouncycastle.util.encoders.Hex.decode(privateKey))); hmac.update(src.getBytes(), 0, src.getBytes().length); // 执行摘要 byte[]hmacMDdBytes = new byte[hmac.getMacSize()]; hmac.doFinal(hmacMDdBytes, 0); return new String(org.bouncycastle.util.encoders.Hex.encode(hmacMDdBytes)); } }
============================================================================MAC加解密工具测试类:
/** * MAC加密 */ @Test public void test_MAC() { String src = "object-oriente"; System.out.println("jdkHmacMD5:\t" + SecurityMac.jdkHmacMD5(src)); System.out.println("bcHmacMD5:\t"+ SecurityMac.bouncyCastleHmacMD5(src)); }