栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

13 摘要算法之mac

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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();
    
    @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

    }
    
    @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
    }

    
    @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
    }

    
    @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();

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

    
    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;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1007453.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号