13 摘要算法之mac

  1. mac: 消息认证码,是一种带有密钥的hash函数.
    与md5和sha-256,shs-512的不同在于后者不可以带有密钥.
  2. 分别使用jdk原生的方法和codec分别实现
import com.yutu.pwd.util.MessageUtils;
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;

public class MacTest {

    private static final String UTF8 = StandardCharsets.UTF_8.name();
    /**
     * 使用codec实现mac编码
     */
    @Test
    public void S() throws Exception{
        String key = "123";
        String str = "小汪学java";
        //Hmac_MD5
        String hmacMD5 = new HmacUtils(HmacAlgorithms.HMAC_MD5, key.getBytes(UTF8))
                .hmacHex(str.getBytes(UTF8));
        System.out.println("hmacMD5: " + hmacMD5);
        //hmacMD5: 37410e4694b2a06e44389499640c7a3d

        String hmacHex256 = new HmacUtils(HmacAlgorithms.HMAC_SHA_256, key.getBytes(UTF8))
                .hmacHex(str.getBytes(UTF8));
        System.out.println("hmacHex256: " + hmacHex256);
        //hmacHex256: 67af93ae1d37f975e3ab8660900430d82b3fd55819540407eebcb70de0628452

        String hmacHex512 = new HmacUtils(HmacAlgorithms.HMAC_SHA_512, key.getBytes(UTF8))
                .hmacHex(str.getBytes(UTF8));
        System.out.println("hmacHex512: " + hmacHex512);
        //hmacHex512: 0805bd75e61c3b6f83f293e8a99140a17833b5a2bd463d84b129cfdcf9423be3424ae0c51396f84e539dbda1f9eaaa69ad934329f3f9f69bf54e10c687db8c80

    }
    /**
     * 使用jdk原生的api实现mac
     * @throws Exception
     */
    @Test
    public void test1() throws Exception{
        //指定密钥(salt)
        String key = "123";

        String str = "小汪学java";
        String algorithm = "HmacMD5";//算法名对象
        String hmacStr = MessageUtils.doMacDigest(str,key,algorithm);
        System.out.println("hexStr: " + hmacStr);
        //hexStr: 37410e4694b2a06e44389499640c7a3d
    }

    /**
     * HmacSHA256
     * @throws Exception
     */
    @Test
    public void test2() throws Exception{
        //指定密钥(salt)
        String key = "123";

        String str = "小汪学java";
        String algorithm = "HmacSHA256";//算法名对象
        String hmacStr = MessageUtils.doMacDigest(str,key,algorithm);
        System.out.println("hexStr: " + hmacStr);
        //hexStr: 67af93ae1d37f975e3ab8660900430d82b3fd55819540407eebcb70de0628452
    }

    /**
     * HmacSHA512
     * @throws Exception
     */
    @Test
    public void test3() throws Exception{
        //指定密钥(salt)
        String key = "123";

        String str = "小汪学java";
        String algorithm = "HmacSHA512";//算法名对象
        String hmacStr = MessageUtils.doMacDigest(str,key,algorithm);
        System.out.println("hexStr: " + hmacStr);
        //hexStr: 0805bd75e61c3b6f83f293e8a99140a17833b5a2bd463d84b129cfdcf9423be3424ae0c51396f84e539dbda1f9eaaa69ad934329f3f9f69bf54e10c687db8c80
    }

}

补充了一下工具类:

import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;

public class MessageUtils {

    private static final String UTF8 = StandardCharsets.UTF_8.name();

    /**
     * 实现mac编码
     * @param originalContent 原始字符串
     * @param key mac算法的key
     * @param algorithm 算法名字,如MAC,SHA-256,SHA-512,MD5等
     * @return
     */
    public static String doMacDigest(String originalContent,String key,String algorithm){
        try{
            //获取消息摘要算法对象
            Mac mac = Mac.getInstance(algorithm);
            //获取key对象并初始化mac
            SecretKey secretKey = new SecretKeySpec(key.getBytes(UTF8), algorithm);
            //使用key初始化mac对象
            mac.init(secretKey);
            //获取原始内容的字节数组
            byte[] originalBytes = originalContent.getBytes(UTF8);
            //获取摘要结果
            byte[] bytes = mac.doFinal(originalBytes);

            String hexStr = HexUtils.covertBytes2HexStr(bytes);
            return hexStr;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 执行消息摘要
     * @param originalContent 原始字符串
     * @param algorithm 算法名,如MD5
     * @return 摘要内容
     */
    public static String doDigest(String originalContent,String algorithm){
        try{
            //获取消息摘要算法对象
            MessageDigest md = MessageDigest.getInstance(algorithm);
            //获取原始内容的字节数组
            byte[] bytes = originalContent.getBytes(UTF8);
            //获取摘要结果
            byte[] digestBytes = md.digest(bytes);

            String hexStr = HexUtils.covertBytes2HexStr(digestBytes);
            return hexStr;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值