首页 > 代码库 > java-信息安全(一)-BASE64,MD5,SHA,HMAC

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、MD3和MD4。

使用:

    @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