java-信息安全-BASE64,MD5,SHA,HMAC

Posted 木子旭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java-信息安全-BASE64,MD5,SHA,HMAC相关的知识,希望对你有一定的参考价值。

 

概述

信息安全基本概念:

  • BASE64 编码格式
  • MD5(Message Digest algorithm 5,信息摘要算法)
  • SHA(Secure Hash Algorithm,安全散列算法)
  • HMAC(Hash Message Authentication Code,散列消息鉴别码)

Base64

  按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.) 

使用:推荐使用 org.apache.commons.codec.binary.Base64

    @Test
    public void testEncodeBase64() throws Exception {
        byte[] encodeBase64 = org.apache.commons.codec.binary.Base64
                .encodeBase64("进行Base64".getBytes("UTF-8"));
        System.out.println(new String(encodeBase64));//6L+b6KGMQmFzZTY0
    }

    @Test
    public void testSDecodeBase64() throws Exception {
        byte[] decodeBase64 = org.apache.commons.codec.binary.Base64
                .decodeBase64("6L+b6KGMQmFzZTY0");
        System.out.println(new String(decodeBase64));//进行Base64
    }

MD5

  Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

  MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3MD4

使用:

    @Test
    public void testMD5() throws Exception {
        String md5Msg = msgSafeBase("测试MD5","MD5");
        System.out.println(md5Msg);// c2dbb895a66c3ca924ccdbea49fa6884
    }
    
    
    public String msgSafeBase(String msg, String algorithmName) throws Exception {
        MessageDigest m = MessageDigest.getInstance(algorithmName);
        m.update(msg.getBytes("UTF8"));
        byte s[] = m.digest();
        return Hex.encodeHexString(s);
    }

SHA

  安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。

  安全散列算法SHA(Secure Hash Algorithm,SHA)是美国国家标准技术研究所发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3。其中规定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过2^64二进制位的消息。SHA-384和SHA-512适用于长度不超过2^128二进制位的消息。

  sha1已不推荐使用

使用:

    @Test
    public void testSHA() throws Exception {
        // SHA-1,SHA-256,SHA-384,和SHA-512
        String hashMsg = msgSafeBase("测试SHA", "SHA-1");
        System.out.println(hashMsg);
        // sha1:9bfec0ff7027c76c28fdaa51bd5a619c5e2f69bb
    }

    public String msgSafeBase(String msg, String algorithmName) throws Exception {
        MessageDigest m = MessageDigest.getInstance(algorithmName);
        m.update(msg.getBytes("UTF8"));
        byte s[] = m.digest();
        return Hex.encodeHexString(s);
    }

HMAC

  HMAC是密钥相关的哈希运算消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。

  运算作用

    (1)验证TPM接受的授权数据和认证数据;
    (2)确认TPM接受到的命令请求是已授权的请求,并且,命令在传送的过程中没有被改动过。
  定义HMAC需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个密钥K。我们用B来表示数据块的字节数。(以上所提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16,SHA-1中L=20)。鉴别密钥的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。一般情况下,推荐的最小密钥K长度是L个字节

使用:

    @Test
    public void testHashMsgCode() throws Exception {
        String macKey = initMacKey();
        System.out.println(macKey);
        //vTVhh1xBdDTm9/TZhVsOK0+G/Aw2fkCx0gC6KcM7o2lbCy6DyatcUSe66PTu70E7J0r/hhtodcZBPuLI4/aCgw==
        
        String msgCode=hashMsgCode("测试HMAC".getBytes(),macKey);
        System.out.println(msgCode);
        //7e4f0f95cfef2c8f5af9799d03798e76
    }

    public static String initMacKey() throws Exception {
        // HmacMD5,HmacSHA1,HmacSHA256,HmacSHA384,HmacSHA512
        KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
        SecretKey secretKey = keyGenerator.generateKey();
        return new String(Base64.encodeBase64(secretKey.getEncoded()));
    }

    public static String hashMsgCode(byte[] data, String key) throws Exception {
        SecretKey secretKey = new SecretKeySpec(Base64.decodeBase64(key),
                "HmacMD5");
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());
        mac.init(secretKey);
        return new String(Hex.encodeHex(mac.doFinal(data)));
    }

 

以上是关于java-信息安全-BASE64,MD5,SHA,HMAC的主要内容,如果未能解决你的问题,请参考以下文章

网络安全——Base64编码MD5SHA1-SHA512HMAC(SHA1-SHA512)哈希

Java 语言实现 MD5 加密

Java加密技术——BASE64与单向加密算法MD5&SHA&MAC

WebRTC Native M96 基础Base模块介绍之实用方法的封装(MD5Base64时间随机数)

WebRTC Native M96 基础Base模块介绍之实用方法的封装(MD5Base64时间随机数)

Golangpython中MD5SHA512base64编码等