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

你可能感兴趣的:(base64)