Java数字摘要 MD5

参考链接: http://blog.csdn.net/jjwwmlp456/article/details/21029159

[java] view
plain
copyprint?

  1. package com.jackie.security;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.security.DigestInputStream;
  7. import java.security.DigestOutputStream;
  8. import java.security.MessageDigest;
  9. import java.util.Arrays;
  10. import javax.crypto.Mac;
  11. import javax.crypto.SecretKey;
  12. import javax.crypto.SecretKeyFactory;
  13. import javax.crypto.spec.PBEKeySpec;
  14. /**
  15. * 消息摘要是一种算法:无论原始数据多长,消息摘要的结果都是固定长度的;是一种不可逆的算法
  16. * 原始数据任意bit位的变化,都会导致消息摘要的结果有很大的不同,且根据结果推算出原始数据的概率极低。
  17. * 消息摘要可以看作原始数据的指纹,指纹不同则原始数据不同。
  18. */
  19. public class MD5 {
  20. public static void main(String[] args) throws Exception {
  21. encodeByMAC("中国oP……&*()…&802134…");
  22. encodeByMd5("中国oP……&*()…&802134…");
  23. md5File();
  24. }
  25. /**
  26. * 使用MAC 算法的 消息摘要
  27. * @param data
  28. * @throws Exception
  29. */
  30. public static void encodeByMAC(String data) throws Exception{
  31. //      KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
  32. //      SecretKey key = keyGen.generateKey(); //这个每次生成的key不一样, 此处不能使用
  33. PBEKeySpec keySpec = new PBEKeySpec("randomkey^(^&*^%$".toCharArray());
  34. SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
  35. SecretKey key = keyFactory.generateSecret(keySpec);
  36. /*
  37. *  此类提供“消息验证码”(Message Authentication Code,MAC)算法的功能。
  38. *  MAC 基于秘密密钥提供一种方式来检查在不可靠介质上进行传输或存储的信息的完整性。
  39. *  通常,消息验证码在共享秘密密钥的两个参与者之间使用,以验证这两者之间传输的信息。
  40. *  基于加密哈希函数的 MAC 机制也叫作 HMAC。结合秘密共享密钥,
  41. *  HMAC 可以用于任何加密哈希函数(如 MD5 或 SHA-1)
  42. */
  43. Mac mac = Mac.getInstance("HmacMD5");
  44. mac.init(key);
  45. byte[] dest = mac.doFinal(data.getBytes());
  46. System.out.println(dest.length);
  47. System.out.println("MAC摘要:" + Arrays.toString(dest));
  48. }
  49. /**
  50. * md5加密  使用消息摘要MessageDigest 处理
  51. * @throws Exception
  52. */
  53. public static String encodeByMd5(String str) throws Exception{
  54. MessageDigest md5;
  55. md5 = MessageDigest.getInstance("MD5");
  56. md5.update(str.getBytes()); //先更新摘要
  57. byte[] digest = md5.digest(); //再通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。
  58. /*
  59. * 使用指定的 byte 数组对摘要进行最后更新,然后完成摘要计算。
  60. * 也就是说,此方法首先调用 update(input),
  61. * 向 update 方法传递 input 数组,然后调用 digest()。
  62. */
  63. //      byte[] digest = md5.digest(str.getBytes());
  64. String hex = toHex(digest);
  65. System.out.println("MD5摘要:" + hex);
  66. return hex;
  67. }
  68. /**
  69. * 文件数据摘要
  70. * @throws Exception
  71. */
  72. public static void md5File() throws Exception {
  73. MessageDigest messageDigest = MessageDigest.getInstance("MD5");
  74. DigestOutputStream dos = new DigestOutputStream(new FileOutputStream(new File("abc.txt")), messageDigest);
  75. dos.write("中华人民……&())f*(214)admin*".getBytes());
  76. dos.close();
  77. byte[] digest = messageDigest.digest();
  78. System.out.println("使用流写文件,该文件的摘要为:" + toHex(digest));
  79. DigestInputStream dis = new DigestInputStream(new FileInputStream(new File("abc.txt")), messageDigest);
  80. byte[] buf = new byte[100];
  81. int len;
  82. while ((len = dis.read(buf)) != -1) {
  83. System.out.println("读取到的数据为:" + new String(buf, 0, len));
  84. }
  85. dis.close();
  86. byte[] digest2 = messageDigest.digest();
  87. //当流读取完毕,即将文件读完了, 这时的摘要 才与 写入时的 一样
  88. System.out.println("使用流读文件,该文件的摘要为:" + toHex(digest2));
  89. }
  90. /**
  91. * md5 摘要转16进制
  92. * @param digest
  93. * @return
  94. */
  95. private static String toHex(byte[] digest) {
  96. StringBuilder sb = new StringBuilder();
  97. int len = digest.length;
  98. String out = null;
  99. for (int i = 0; i < len; i++) {
  100. //          out = Integer.toHexString(0xFF & digest[i] + 0xABCDEF); //加任意 salt
  101. out = Integer.toHexString(0xFF & digest[i]);//原始方法
  102. if (out.length() == 1) {
  103. sb.append("0");//如果为1位 前面补个0
  104. }
  105. sb.append(out);
  106. }
  107. return sb.toString();
  108. }
  109. }
时间: 2024-08-13 08:03:13

Java数字摘要 MD5的相关文章

常用的加密算法---数字摘要

数字摘要: 数字摘要也称为消息摘要,它是一个唯一对应一个消息或文本的固定长度的值,它是一个单向 Hash函数对消息进行计算产生的. 摘要生成的过程:待摘要串-----> Hash函数-----> 摘要 消息摘要的特点: 1.无论输入的消息多长,计算出来的消息摘要的长度是固定的.例如:MD5 的为128个比特位,SHA-1的为 160个比特位: 2.一般只要输入的消息不同,对其产生的摘要消息也是不相同的,相同的输入必然会产生相同的摘要消息: 3.由于消息摘要并不包含原文的完整信息,因此只能进行正

java加密算法小结--MD5加密算法

上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇来整理一下一个被广泛应用的加密算法---MD5. 简单了解 MD5(Message Digest Algorithm 5),翻译过来是消息摘要算法第五版,按照惯例,我们推理可能也有MD2,MD3这样名字的历史版本.. 即使完全不了解这个算法的原理,我们也可以从命名中看出一些眉道,所谓摘要,就是一个简短的概括,像我写过的毕业论文,上来第一部分就是摘要,它对后面长篇大论的文章做了一个简短有力的概

数字摘要

数字摘要原理 数字摘要也称为信息摘要,他是唯一对应一个消息或者文本的固定长度的值,他有单向hash函数生成.生成的数字摘要可以对传输中的消息的完整性进行验证.数字摘要的特征如下: 1.无论传入的消息有多长都会返回固定长度的信息. 2.传入的消息不同,返回的数字摘要也不相同.但是相同的输入必定会产生相同的输出. 3.由于消息摘要并不包含原文的完整信息,一次无法从摘要中恢复出原来的信息. MD5 MD5生成的摘要长度为128位,MD5的使用实例如下: public static byte[] tes

java数字字符串累加1的解决方案

近期操作项目遇到这样的问题,研究了下搞出了一个解决方案. //num也可以是在数字字符串里面截取的,比如我有14位的数字字符串前六位是市级,7,8位代表县区,后两位代表乡镇,最后四位是累计+1的,这个时候你就可以根据前10位查出最大的是多少,然后用最大的+1得出新的最大的.. //你要+1的字符串 String num="0000"; //转成整数并执行累加操作,但是可能位数变少了,怎么办呢? int i=Integer.valueOf(Num)+1; //为了拼接字符串使用 Stri

java 短连接+MD5加密短链接

java 短连接+MD5加密短链接 import java.security.MessageDigest; public class ShotUrlUtil { public static void main(String[] args) { System.out.println(shortUrl("http://www.baidu.com/")); } public static String shortUrl(String url) { String[] chars = new S

关于《Java数字图像处理-编程技巧与应用实践》一书 源代码

关于<Java数字图像处理-编程技巧与应用实践>一书 源代码 本书所有的源代码我已经整理上传到华章图书的官方网站与 我自己的GITHUB上,本人GITHUB的地址如下: https://github.com/gloomyfish/mybook-java-imageprocess其 中书中的多数内容在本人的博客专栏上面有覆盖,但是不完全 是博客内容的翻版,阅读本人博客想找可以运行源代码的读者 可以到github上自己下载,如果发现有任何源代码错误,请给我 发邮件或者留言,本人感激不尽. 特此声明

【转】Java数字抽奖游戏核心代码

1. [代码][Java]代码    package com.luiszhang.test; import java.util.Arrays; /** * NumberLotteryGame * 一个简单的数字彩票游戏类 * @author LuisZhang * 参考了core java 8th中的例3-7的设计思想 */public class NumberLotteryGame {    private int gamesNumber;    // 生成游戏的数量,为以后多线程扩展做考虑 

和安全有关的那些事(非对称加密、数字摘要、数字签名、数字证书、SSL、HTTPS及其他)

本文原文连接:http://blog.csdn.net/bluishglc/article/details/7585965 转载请注明出处! 对于一般的开发人员来说,很少需要对安全领域内的基础技术进行深入的研究,但是鉴于日常系统开发中遇到的各种安全相关的问题,熟悉和了解这些安全技术的基本原理和使用场景还是非常必要的.本文将对非对称加密.数字摘要.数字签名.数字证书.SSL.HTTPS等这些安全领域内的技术进行一番简要的介绍,解释他们之间的关系,同时补充一些周边话题.   0. 概览--常用安全技

Java 自带MD5 校验文件

http://www.iteye.com/topic/1127319 前天第一次发表博客到论坛,关于Java文件监控一文,帖子地址在:http://www.iteye.com/topic/1127281 评论的朋友很多,下载代码的朋友很不少,感谢在论坛上看我帖子的朋友,还有回复评论的朋友,给我提供建议的朋友. 从这些建议中,虽然语言简短,但是却有的是一语中的,这里说一下一下关于帖子的代码中HashFile中的MD5文件校验算法, 该算法是使用Java自带的MessageDigest类,测试结果,