你的位置:首页 > 软件开发 > Java > 第五章 消息摘要算法

第五章 消息摘要算法

发布时间:2015-12-29 14:00:12
注意:本节内容主要参考自《Java加密与解密的艺术(第2版)》第6章“验证数据完整性--消息摘要算法”5.1、mac(又称为Hmac)原理:在md与sha系列算法的基础上加入了密钥,是三大常用的消息摘要算法中最安全的一个。常用的mac算法: ...

注意:本节内容主要参考自《Java加密与解密的艺术(第2版)》第6章“验证数据完整性--消息摘要算法”

5.1、mac(又称为Hmac)

原理:在md与sha系列算法的基础上加入了密钥,是三大常用的消息摘要算法中最安全的一个。

常用的mac算法:

  • HmacMD5
  • HmacSHA1
  • HmacSHA256

5.2、实现方式

  • JDK(缺少二进制字节数组转十六进制的工具,可借助CC或BC的工具类完成)
  • Commons Codec(CC,在1.10版本中加入的,其中,产生相应算法密钥的API没有找到,如果有人找到了,请和我讲一下,谢谢
  • Bouncy Castle(BC,比较麻烦,具体参考“慕课网”)

5.2.1、基于JDK实现的Hmac系列算法

 1 package com.util.mac; 2  3 import java.io.UnsupportedEncodingException; 4 import java.security.InvalidKeyException; 5 import java.security.NoSuchAlgorithmException; 6  7 import javax.crypto.KeyGenerator; 8 import javax.crypto.Mac; 9 import javax.crypto.SecretKey;10 import javax.crypto.spec.SecretKeySpec;11 12 import org.bouncycastle.util.encoders.Hex;13 14 /**15  * 基于JDK的HmacMD5算法16 */17 public class HmacMD5JDK {18   private static final String ENCODING = "UTF-8";19   private static final String ALGORITHM = "HmacMD5";//指定具体算法HmacMD5,HmacSHA1,HmacSHA25620   21   /**22    * 产生密钥两种方式 1)是由jdk自己来产生的,2)我们可以自己指定一个字节数组23    * 注意:密钥是以二进制字节数组存储的24   */25   public static byte[] getKey() throws NoSuchAlgorithmException{26     SecretKey key = KeyGenerator.getInstance(ALGORITHM).generateKey();27     return key.getEncoded();28   }29   30   /**31    * HmacMD5加密32    * @param data   带加密数据33    * @param keyByte 密钥34   */35   public static byte[] encode(String data, byte[] keyByte) throws NoSuchAlgorithmException, 36                                   InvalidKeyException, 37                                   IllegalStateException, 38                                   UnsupportedEncodingException {39     SecretKey key = new SecretKeySpec(keyByte, ALGORITHM);//还原密钥40     Mac mac = Mac.getInstance(key.getAlgorithm());41     mac.init(key);//为mac实例初始化密钥42     return mac.doFinal(data.getBytes(ENCODING));43   }44   45   /**46    * HmacMD5加密,并转为16进制47   */48   public static String encodeHmacMD5Hex(String data, byte[] keyByte) throws NoSuchAlgorithmException, 49                                        UnsupportedEncodingException, 50                                        InvalidKeyException, 51                                        IllegalStateException {52     byte[] encodedByte = encode(data, keyByte);53     return new String(Hex.encode(encodedByte));//借助BC54     //return new String(org.apache.commons.codec.binary.Hex.encodeHexString(encodedByte));//借助CC55   }56   57   /**58    * 测试59    * @throws IllegalStateException 60    * @throws InvalidKeyException 61   */62   public static void main(String[] args) throws UnsupportedEncodingException, 63                          NoSuchAlgorithmException, 64                          InvalidKeyException, 65                          IllegalStateException {66     String data = "找一个好姑娘做老婆是我的梦 想!";67     /*************测试encode()**************/68     System.out.println("原文-->"+data);69     byte[] keyByte = HmacMD5JDK.getKey(); 70     byte[] encodedByte = HmacMD5JDK.encode(data, keyByte);71     System.out.println("加密后-->"+encodedByte);72     byte[] encodedByte2 = HmacMD5JDK.encode(data, keyByte);73     System.out.println("加密后-->"+encodedByte2);74     for(int i=0;i<encodedByte.length;i++){75       System.out.println(encodedByte[i]==encodedByte2[i]);76     }77     /*************测试encodeHmacMD5Hex()**************/78     System.out.println("原文-->"+data);79     String encodedStr = HmacMD5JDK.encodeHmacMD5Hex(data, keyByte);80     System.out.println("加密后-->"+encodedStr);81     String encodedStr2 = HmacMD5JDK.encodeHmacMD5Hex(data, keyByte);82     System.out.println("加密后-->"+encodedStr2);83     System.out.println(encodedStr.equals(encodedStr2));84   }85 }

原标题:第五章 消息摘要算法

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录