zoukankan      html  css  js  c++  java
  • Java实现 Base64、MD5、MAC、HMAC加密

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64、MD5、MAC、HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧!

    采用的输UTF-8的格式...

      1 package visec;
      2 import java.security.MessageDigest;
      3 import javax.crypto.KeyGenerator;
      4 import javax.crypto.Mac;
      5 import javax.crypto.SecretKey;
      6 import javax.crypto.spec.SecretKeySpec;
      7 
      8 import Decoder.BASE64Decoder;
      9 import Decoder.BASE64Encoder;
     10 /**
     11  * 基础加密组件
     12  * @author Visec·Dana
     13  * @version 1.0
     14  * @since 1.0
     15  */
     16 public abstract class Coder {
     17     public static final String KEY_SHA = "SHA";
     18     public static final String KEY_MD5 = "MD5";
     19 
     20     /**
     21      * MAC算法可选以下多种算法
     22      * <pre>
     23      * HmacMD5 
     24      * HmacSHA1 
     25      * HmacSHA256 
     26      * HmacSHA384 
     27      * HmacSHA512
     28      * </pre>
     29      */
     30     public static final String KEY_MAC = "HmacMD5";
     31 
     32     /**
     33      * BASE64解密
     34      * @param key
     35      * @return
     36      * @throws Exception
     37      */
     38     public static byte[] decryptBASE64(String key) throws Exception {
     39         return (new BASE64Decoder()).decodeBuffer(key);
     40     }
     41 
     42     /**
     43      * BASE64加密
     44      * @param key
     45      * @return
     46      * @throws Exception
     47      */
     48     public static String encryptBASE64(byte[] key) throws Exception {
     49         return (new BASE64Encoder()).encodeBuffer(key);
     50     }
     51     /**
     52      * MD5加密
     53      * @param data
     54      * @return
     55      * @throws Exception
     56      */
     57     public static byte[] encryptMD5(byte[] data) throws Exception {
     58 
     59         MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
     60         md5.update(data);
     61         return md5.digest();
     62 
     63     }
     64     /**
     65      * SHA加密
     66      * @param data
     67      * @return
     68      * @throws Exception
     69      */
     70     public static byte[] encryptSHA(byte[] data) throws Exception {
     71         MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
     72         sha.update(data);
     73         return sha.digest();
     74 
     75     }
     76     /**
     77      * 初始化HMAC密钥
     78      * @return
     79      * @throws Exception
     80      */
     81     public static String initMacKey() throws Exception {
     82         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
     83         SecretKey secretKey = keyGenerator.generateKey();
     84         return encryptBASE64(secretKey.getEncoded());
     85     }
     86     /**
     87      * MAC加密
     88      * @param data
     89      * @param key
     90      * @return
     91      * @throws Exception
     92      */
     93     public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
     94         SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
     95         Mac mac = Mac.getInstance(secretKey.getAlgorithm());
     96         mac.init(secretKey);
     97         return mac.doFinal(data);
     98 
     99     }
    100 }

    下面是一个测试类,及输入命令

     1 package visec;
     2 
     3 import java.math.BigInteger;
     4 
     5 /**
     6  * 加密测试
     7  * @author Visec·Dana
     8  * @version 1.0
     9  * @since 1.0
    10  */
    11 public class CoderTest {
    12     public static void main(String[] args) throws Exception {
    13         CoderTest.test(); 
    14     }
    15 
    16     public static void test() throws Exception {
    17         String inputStr = "这是一些简单的加密测试";
    18         System.err.println("原文:" + inputStr);
    19 
    20         byte[] inputData = inputStr.getBytes();
    21         String code = Coder.encryptBASE64(inputData);
    22 
    23         System.err.println("BASE64加密后:" + code);
    24 
    25         byte[] output = Coder.decryptBASE64(code);
    26 
    27         String outputStr = new String(output);
    28 
    29         System.err.println("BASE64解密后:" + outputStr);
    30 
    31         //单元测试 Junit4[暂时不用...]
    32         /*// 验证BASE64加密解密一致性
    33         assertEquals(inputStr, outputStr);
    34 
    35         // 验证MD5对于同一内容加密是否一致
    36         assertArrayEquals(Coder.encryptMD5(inputData), Coder
    37                 .encryptMD5(inputData));
    38 
    39         // 验证SHA对于同一内容加密是否一致
    40         assertArrayEquals(Coder.encryptSHA(inputData), Coder
    41                 .encryptSHA(inputData));
    42 
    43         String key = Coder.initMacKey();
    44         System.err.println("Mac密钥:/n" + key);
    45 
    46         // 验证HMAC对于同一内容,同一密钥加密是否一致
    47         assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(
    48                 inputData, key));
    49         */
    50         BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
    51         System.err.println("MD5:" + md5.toString(16));
    52 
    53         BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
    54         System.err.println("SHA:" + sha.toString(32));
    55 
    56         BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
    57         System.err.println("HMAC:" + mac.toString(16));
    58     }
    59 }

    下面呢是控制台输出:

    原文:这是一些简单的加密测试
    BASE64加密后:6L+Z5piv5LiA5Lqb566A5Y2V55qE5Yqg5a+G5rWL6K+V

    BASE64解密后:这是一些简单的加密测试
    MD5:76757e30d128e82b14488b115794d959
    SHA:6f7afslor1oev1k7k40um57cscuqkjtn
    HMAC:782313e944a28a55fc20507e50a9d470

  • 相关阅读:
    计算机是如何启动的
    比特币
    区块链技术
    哈夫曼树与哈夫曼编码
    Prim Algoritm(最小生成树)
    机器学习概述总览
    线性查找算法(BFPRT)
    DFS(深度优先搜索)
    BFS(广度优先搜索)
    (Dijkstra)迪杰斯特拉算法-最短路径算法
  • 原文地址:https://www.cnblogs.com/visec479/p/3780295.html
Copyright © 2011-2022 走看看