铁马冰河2000

导航

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));
    }

 

posted on 2022-01-23 22:26  铁马冰河2000  阅读(818)  评论(0编辑  收藏  举报