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 }
时间: 2024-09-26 20:08:27

JDK自带方法实现消息摘要运算的相关文章

JDK自带方法实现RSA数字签名

JDK只支持MD2withRSA, MD5withRSA, SHA1withRSA 其他的如SHA512withRSA需要第三方包支持,如BC(bouncy castle) JDK的密钥长度默认仍是1024 1 package jdbc.pro.lin; 2 3 import java.security.InvalidKeyException; 4 import java.security.NoSuchAlgorithmException; 5 import java.security.Priv

JDK自带方法实现AES对称加密

请看代码. 1 package jdbc.pro.lin; 2 3 import java.security.InvalidAlgorithmParameterException; 4 import java.security.InvalidKeyException; 5 import java.security.NoSuchAlgorithmException; 6 7 import javax.crypto.BadPaddingException; 8 import javax.crypto

JDK自带方法实现RSA对称加密

1 package jdbc.pro.lin; 2 3 import java.security.InvalidKeyException; 4 import java.security.Key; 5 import java.security.KeyFactory; 6 import java.security.KeyPair; 7 import java.security.KeyPairGenerator; 8 import java.security.NoSuchAlgorithmExcept

MD5算法介绍及jdk自带实现方式

MD5算法,已经被人们熟知,作为一名资深或者入门级的开发者,都号称"MD5啊,知道知道".前几天程序略有小问题,原因是有的地方加密了,有的地方没加密.有个同事很得意的说,MD5就是个hash算法,很容易被解密的.当时我是无言以对了.因为俺记得MD5是不可逆的,既然不可逆,又哪里来的"解密"呢.于是我们在网上搜索"MD5解密",哇kao,竟然真的有结果,然则,事实并非那么简单,我们把MD5的一串序列放到"在线MD5解密"中去解密

JDK自带的二分查找算法和自己写的普通二分查找算法的比较(java二分查找源代码)

一.描述 解析和比较JDK自带的二分查找算法和自己写的普通二分查找算法,使用二进制位无符号右移来代替除2运算,并使用产生随机数的方法产生一定范围的随机数数组,调用Arrays类的sort()静态方法,对int类型数组进行排序. Math.random()的用法:会产生一个[0,1)之间的随机数(注意能取到0,不能取到1),这个随机数的是double类型,要想返回指定范围的随机数如[m,n]之间的整数的公式:(int)(Math.random()*(m-n+1)+m) 二.源代码 <span st

死锁排查的小窍门 --使用jdk自带管理工具jstack

本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 开发时间久了,难免会写出一些一些死锁的代码,自己明明调用该方法可该方法就是不执行.不进该方法.日志也不打印! 这里我们模拟一段死锁的代码,使用jdk自带的管理工具来排查是不是死锁了! 1 //思索代码 2 public class DeadLockDemo implements Runnable{ 3 4 public int flag = 1; 5 //静态对象是类的所有对象共享的 6 privat

Java 常用的日志工具——JDK自带的java.util.logging包、APACHE 的log4j 与 slf4j日志处理接口

考虑以下情况: (1).根据程序输出可以很好地帮助程序员调试程序.在编写小型程序时,可以在程序中不断增加 System.out.print() 语句来查看程序运行状态:在大型系统中,显然这一做法非常不对,可以考虑将调试信息通过日志处理工具,输出到一个文本文件中,然后查看文件内容. (2).在系统开始线上运行后,系统管理人员需要获知系统的运行情况,包括但不限于系统开始运行时间.系统关闭时间.系统目前处理任务等,这些状态需要输出到一个经过格式化的日志文件中,供管理人员查看: (3).在编写系统,甚至

jdk自带常用命令行工具使用

下面是笔者整理的jdk自带的常用命令行工具的使用方法,全部原创,转载请注明出处,并贴上链接,谢谢! jps命令使用 jstat命令使用 jinfo命令使用 jmap命令使用 jhat命令使用 jstack命令使用 jcmd命令使用

任务调度(一)——jdk自带的Timer

说到任务调度,大家可能会想到Quartz框架,但是jdk自带的简单任务调度工具类,反而了解的人并不是很多.我觉得如果你的业务相对简单的话,没必要非得用Quartz等框架,使用Timer完全可以胜任的.简单来分享一下我了解的Timer. Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次. TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务. 我是用TimerTask来创