1.工具类
1 package com.java.test; 2 3 import java.security.MessageDigest; 4 5 public class MD5Util { 6 7 public final static String MD5(String s) { 8 char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 9 try { 10 byte[] btInput = s.getBytes(); 11 // 获得MD5摘要算法的 MessageDigest 对象 12 MessageDigest mdInst = MessageDigest.getInstance("MD5"); 13 // 使用指定的字节更新摘要 14 mdInst.update(btInput); 15 // 获得密文 16 byte[] md = mdInst.digest(); 17 // 把密文转换成十六进制的字符串形式 18 int j = md.length; 19 char str[] = new char[j * 2]; 20 int k = 0; 21 for (int i = 0; i < j; i++) { 22 byte byte0 = md[i]; 23 str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 24 str[k++] = hexDigits[byte0 & 0xf]; 25 } 26 return new String(str); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 return null; 30 } 31 } 32 }
2.测试
1 package com.java.test; 2 3 import org.junit.Test; 4 5 public class MD5UtilTest { 6 7 @Test 8 public void test(){ 9 System.out.println("md5:"+MD5Util.MD5("md5")); 10 System.out.println(MD5Util.MD5("1234567890098765432112345678900987654321abcd")); 11 System.out.println(MD5Util.MD5("1234567890098765432112345678900987654321a")); 12 } 13 14 @Test 15 public void test1(){ 16 String p1 = "hello"; 17 String p2 = "hello"; 18 String pwd1 = MD5Util.MD5(p1); 19 String pwd2 = MD5Util.MD5(p2); 20 System.out.println(pwd1.equals(pwd2)); 21 } 22 23 }
控制台输出:
md5:1BC29B36F623BA82AAF6724FD3B16718
E85CC9E2A809720A20EA9880FCC09B5C
952406404126799A09F24D598F1F1A10
true
3.MD5原理
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
4.MD5深入理解
数学上来说不可以逆向破解,它的破解都是碰撞和暴力破解。山东大学女教授王小云使用的也是碰撞破解方法(具体技术不详,可简单的理解为就是拿一个密码去加密试着生成一样的16进制密码,但是其实其明文是不同的,这样也就实现了两个不同明文密码生成了一样的MD5码,这也就是说你的密码被破解了,其实不是真正的知道了,而是找到了密码的同胞兄弟的意思,这样你的信息就被盗取了)。
5.曾经的疑问
MD5是无限集合到有限集合的映射,利用碰撞还是有可能破解MD5的(其实是一种「伪破解」)。这就是王小云教授提出MD5破解的原理所在。