天偶然的学习了一下几种关于消息摘要算法的知识。个人觉得很好。应着老话“好记性不如烂笔头”,我就码了几行代码咯。


算法嘛,没什么好说的了。毕竟是设计者智慧与汗水的结晶,也是时代进步的推动力。我们能做的就是将这种算法运用得当,造福全人类,就行了!

//格外需要注意的是采用CC(Commons codec)方式生成消息摘要时,一定要记得导入相关的jar包哦!
  • 1
  • 1

MD方式


  1. package MD;
  2. /**
  3. * MD:MessageDigest—-消息摘要算法
  4. */
  5. import java.security.MessageDigest;
  6. import org.apache.commons.codec.binary.Hex;
  7. import org.apache.commons.codec.digest.DigestUtils;
  8. import org.apache.commons.codec.digest.Md5Crypt;
  9. import org.junit.Test;
  10. /**
  11. * 简单的使用MessageDigest实现消息摘要的小案例
  12. * 收获:
  13. * 使用摘要算法获得字节数组无法直接输出,需要转成相应的十六进制才能获得结果
  14. * @author Summer
  15. *
  16. */
  17. public class Demo {
  18. private static String targetString = “I am Summer!”;
  19. /**
  20. * 测试MD5算法加密效果,转成了十六进制
  21. * JDK实现
  22. * @throws Exception
  23. */
  24. @Test
  25. public void test1() throws Exception {
  26. MessageDigest md = MessageDigest.getInstance(“MD5”);
  27. byte [] bytes = md.digest(targetString.getBytes());
  28. String result = Hex.encodeHexString(bytes);
  29. System.out.println(“MD5加密后的串是:”+result);
  30. //5b704caf20c179cdf61d7121e59dcd76
  31. }
  32. /**
  33. * 测试MD2算法加密效果,转成了十六进制
  34. * JDK实现
  35. * @throws Exception
  36. */
  37. @Test
  38. public void test2() throws Exception {
  39. MessageDigest md = MessageDigest.getInstance(“MD2”);
  40. byte [] bytes = md.digest(targetString.getBytes());
  41. String result = Hex.encodeHexString(bytes);
  42. System.out.println(“MD5加密后的串是:”+result);
  43. //387992acc0a756abc7026d635383b0a7
  44. }
  45. /**
  46. * 测试MD2算法加密效果,不转成十六进制
  47. * JDK实现
  48. * @throws Exception
  49. */
  50. @Test
  51. public void test3() throws Exception {
  52. MessageDigest md = MessageDigest.getInstance(“MD2”);
  53. byte [] bytes = md.digest(targetString.getBytes());
  54. System.out.println(bytes);
  55. }
  56. /**
  57. * 测试MD5算法加密效果,不转成十六进制
  58. * JDK实现
  59. * @throws Exception
  60. */
  61. @Test
  62. public void test4() throws Exception {
  63. MessageDigest md = MessageDigest.getInstance(“MD5”);
  64. byte [] bytes = md.digest(targetString.getBytes());
  65. System.out.println(bytes.toString());
  66. }
  67. /**
  68. * 使用commons codec的方式对目标字符串进行加密MD2,并使用十六进制进行输出
  69. * @throws Exception
  70. */
  71. @Test
  72. public void test5() throws Exception {
  73. MessageDigest md = DigestUtils.getMd2Digest();
  74. byte[] bytes = md.digest(targetString.getBytes());
  75. String result = Hex.encodeHexString(bytes);
  76. System.out.println(“Commons codec 方式加密MD2:”+ result);
  77. //387992acc0a756abc7026d635383b0a7
  78. }
  79. /**
  80. * 使用commons codec的方式对目标字符串进行加密MD5,并使用十六进制进行输出
  81. * 对比方法发现,使用CC这个开源方式,可以大大的简化操作。但其底层仍是JDK实现的,cc知识做了一些简化,仅此而已
  82. * @throws Exception
  83. */
  84. @Test
  85. public void test6() throws Exception {
  86. MessageDigest md = DigestUtils.getMd5Digest();
  87. byte[] bytes = md.digest(targetString.getBytes());
  88. String result = Hex.encodeHexString(bytes);
  89. System.out.println(“Commons codec 方式加密MD5:”+ result);
  90. //5b704caf20c179cdf61d7121e59dcd76
  91. System.out.println(DigestUtils.md5Hex(targetString));
  92. //5b704caf20c179cdf61d7121e59dcd76
  93. }
  94. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108

SHA方式


  1. package SHA;
  2. /**
  3. * SHA: Security Hash Algorithm —–安全哈希算法
  4. */
  5. import java.security.MessageDigest;
  6. import org.apache.commons.codec.binary.Hex;
  7. import org.junit.Test;
  8. public class Demo {
  9. private static String targetString = “I am Summer!”;
  10. /**
  11. * 使用JDK方式以SHA1的方式实现消息摘要算法
  12. * @throws Exception
  13. */
  14. @Test
  15. public void testSHA1() throws Exception {
  16. /*方式一:
  17. * //算法名称对于SHA1方式: 可以是SHA也可以是SHA1
  18. MessageDigest md = MessageDigest.getInstance(“SHA”);
  19. byte[] bytes = md.digest(targetString.getBytes());
  20. String result = Hex.encodeHexString(bytes);
  21. System.out.println(“JDK 方式实现SHA1消息摘要的加密:\t”+ result);
  22. //a621ca634410c2521ef560736a6a9da048f42961
  23. */
  24. /*
  25. * 方式二:
  26. */
  27. MessageDigest md = MessageDigest.getInstance(“SHA”);
  28. md.update(targetString.getBytes());
  29. String result = Hex.encodeHexString(md.digest());
  30. System.out.println(result);
  31. }
  32. /**
  33. * 使用JDK方式以SHA-224的方式实现消息摘要算法
  34. * @throws Exception
  35. */
  36. @Test
  37. public void testSHA224() throws Exception {
  38. MessageDigest md = MessageDigest.getInstance(“SHA-224”);
  39. md.update(targetString.getBytes());
  40. String result = Hex.encodeHexString(md.digest());
  41. System.out.println(result);
  42. //6fb07533ef05a1f1b6a0fbd25f08ed3cbcf17807a507c0224756f06d
  43. }
  44. /**
  45. * 使用JDK方式以SHA-384的方式实现消息摘要算法
  46. * @throws Exception
  47. */
  48. @Test
  49. public void testSHA384() throws Exception {
  50. MessageDigest md = MessageDigest.getInstance(“SHA-384”);
  51. md.update(targetString.getBytes());
  52. String result = Hex.encodeHexString(md.digest());
  53. System.out.println(result);
  54. //c640d1c73a8e2078b290f284fce59da103ecfc1c3c9442cc90ebd5f08900d8e6f19551da7b2f213d96dd055bd2759698
  55. }
  56. /**
  57. * 使用JDK方式以SHA-256的方式实现消息摘要算法
  58. * @throws Exception
  59. */
  60. @Test
  61. public void testSHA256() throws Exception {
  62. MessageDigest md = MessageDigest.getInstance(“SHA-256”);
  63. md.update(targetString.getBytes());
  64. String result = Hex.encodeHexString(md.digest());
  65. System.out.println(result);
  66. //8305809696717b31c6765b7ba89cfd67c17ef62c79a700ae4e305fee5ebdf457
  67. }
  68. /**
  69. * 使用JDK方式以SHA-512的方式实现消息摘要算法
  70. * @throws Exception
  71. */
  72. @Test
  73. public void testSHA512() throws Exception {
  74. MessageDigest md = MessageDigest.getInstance(“SHA-512”);
  75. md.update(targetString.getBytes());
  76. String result = Hex.encodeHexString(md.digest());
  77. System.out.println(result);
  78. //520abdfdc5e0ac43c795bee9da1cac3fa2f55b8e89f1d33f9a4b83367f4b74cd5d42bfa2c6d4f68c362e64d44ea664244c03c7fd2b7bc167a489fe7129c91156
  79. }
  80. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107

MAC方式


  1. package MAC;
  2. import javax.crypto.KeyGenerator;
  3. import javax.crypto.Mac;
  4. import javax.crypto.SecretKey;
  5. import javax.crypto.spec.SecretKeySpec;
  6. import org.apache.commons.codec.binary.Hex;
  7. import org.junit.Test;
  8. /**
  9. * MAC: Message Authentication Code ——消息验证码
  10. */
  11. public class Demo {
  12. private static String targetString = “I am Summer!”;
  13. /**
  14. * 使用MAC算法以MD5方式加密
  15. * @throws Exception
  16. */
  17. @Test
  18. public void hmacMD5() throws Exception {
  19. //初始化KeyGeerator
  20. KeyGenerator keyGenerator = KeyGenerator.getInstance(“HmacMD5”);
  21. //产生密钥
  22. SecretKey secretKey = keyGenerator.generateKey();
  23. //获得密钥
  24. byte[] key = secretKey.getEncoded();
  25. key = Hex.decodeHex(new char[]{‘S’,‘u’,‘m’,‘m’,‘e’,‘r’,‘!’});
  26. //还原密钥
  27. SecretKey restoreSecretKey = new SecretKeySpec(key, “HmacMD5”);
  28. //实例化Mac
  29. Mac mac = Mac.getInstance(restoreSecretKey.getAlgorithm());
  30. //初始化Mac
  31. mac.init(restoreSecretKey);
  32. byte[] hmacMD5Bytes = mac.doFinal(targetString.getBytes());
  33. //转成十六进制并进行输出
  34. String result = Hex.encodeHexString(hmacMD5Bytes);
  35. System.out.println(result);
  36. //8371828a9e53f04977b4d2ceb73ff506
  37. }
  38. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

小总结


对于MAC方式,其原理其实和前两个差不多,只不过是加入了key加密的权限。详见代码哦!