JDK自带方法实现消息摘要运算

啊,有点小注释,懒得介绍了,就贴个代码吧,大意理解就可以了。

复制代码
  1 package jdbc.pro.lin;
  2 
  3 import java.security.InvalidKeyException;
  4 import java.security.MessageDigest;
  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.apache.commons.codec.binary.Base64;
 13 
 14 public class MyMessageDigest {
 15     public static final String PLAIN_TEXT = "i m a sample";
 16     public static final String MD_ALGORITHM = "MD5";
 17     public static final String SHA_ALGORITHM = "SHA-512";
 18     public static final String MAC_ALGORITHM = "HmacSHA512";
 19 
 20     public static void main(String[] args) {
 21         System.out.println("MD5: " + MD5(PLAIN_TEXT.getBytes()));
 22         System.out.println("SHA-512: " + SHA(PLAIN_TEXT.getBytes()));
 23         System.out.println("HmacSHA512:" + MAC(PLAIN_TEXT.getBytes()));
 24     }
 25 
 26     /**
 27      * 1.消息摘要算法,MD家族,有MD2 MD4 MD5,其中MD4 JDK不支持
 28      * 
 29      * @param plainText
 30      * @return
 31      */
 32     public static String MD5(byte[] plainText) {
 33         MessageDigest messageDigest;
 34         try {
 35             messageDigest = MessageDigest.getInstance(MD_ALGORITHM);
 36             return Base64.encodeBase64String(messageDigest.digest(plainText));
 37         } catch (NoSuchAlgorithmException e) {
 38             // TODO Auto-generated catch block
 39             e.printStackTrace();
 40         }
 41         return null;
 42 
 43     }
 44 
 45     /**
 46      * 2.SHA Security Hash Algorithm 安全散列算法,固定长度摘要信息 SHA-1 SHA-2( SHA-224
 47      * SHA-256 SHA-384 SHA-512) 使用的依然是MessageDigest类,JDK不支持224
 48      * 
 49      * @param plainText
 50      * @return
 51      */
 52     public static String SHA(byte[] plainText) {
 53         MessageDigest messageDigest;
 54         try {
 55             messageDigest = MessageDigest.getInstance(SHA_ALGORITHM);
 56             return Base64.encodeBase64String(messageDigest.digest(plainText));
 57         } catch (Exception e) {
 58             e.printStackTrace();
 59         }
 60         return null;
 61     }
 62 
 63     /**
 64      * 3.MAC(Message Authentication Code) 消息认证码算法,是含有密钥散列函数算法。
 65      * 兼容了MD和SHA的特性。
 66      * 加密过程三步走,与后面要介绍的对称加密和非对称加密是相似的
 67      * 1) 传入算法,实例化一个加密器
 68      * 2) 传入密钥,初始化加密器
 69      * 3) 调用doFinal方法进行加密
 70      * @param plainText
 71      * @return
 72      */
 73     public static String MAC(byte[] plainText) {
 74 
 75         try {
 76             byte[] secretBytes = generatorMACSecretKey();
 77             SecretKey key = restoreMACSecretKey(secretBytes);
 78             Mac mac = Mac.getInstance(MAC_ALGORITHM);
 79             mac.init(key);
 80             return Base64.encodeBase64String(mac.doFinal(plainText));
 81         } catch (NoSuchAlgorithmException | InvalidKeyException e) {
 82             // TODO Auto-generated catch block
 83             e.printStackTrace();
 84         }
 85         return null;
 86 
 87     }
 88 
 89     /**
 90      * MAC生成随机密钥 两步走 1.创建一个KeyGenerator 2.调用KeyGenerator.generateKey方法
 91      * 
 92      * @return
 93      */
 94     public static byte[] generatorMACSecretKey() {
 95         KeyGenerator keyGenerator;
 96         try {
 97             keyGenerator = KeyGenerator.getInstance(MAC_ALGORITHM);
 98             SecretKey key = keyGenerator.generateKey();
 99             return key.getEncoded();
100         } catch (NoSuchAlgorithmException e) {
101             // TODO Auto-generated catch block
102             e.printStackTrace();
103         }
104         return null;
105     }
106 
107     /**
108      * 还原密钥
109      * 
110      * @param secretBytes
111      * @return
112      */
113     public static SecretKey restoreMACSecretKey(byte[] secretBytes) {
114         SecretKey key = new SecretKeySpec(secretBytes, MAC_ALGORITHM);
115         return key;
116     }
117 }
复制代码
posted @ 2018-06-04 14:19  无天666  阅读(390)  评论(0编辑  收藏  举报