kyq

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

MD5加密Java版

Posted on 2015-11-30 11:29  kyq  阅读(174)  评论(0编辑  收藏  举报

MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆;所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的MD5算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。

import java.security.MessageDigest;
 
public class Password { 
 private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", 
  "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" }; 
   
// 十六进制下数字到字符的映射数组 
   
/** 把inputString加密 */ 
public static String createPassword(String inputString) { 
 return encodeByMD5(inputString); 
} 
   
/**
 * 验证输入的密码是否正确
 * 
 * @param password
 *            真正的密码(加密后的真密码)
 * @param inputString
 *            输入的字符串
 * @return 验证结果,boolean类型
 */ 
public static boolean authenticatePassword(String password, 
  String inputString) { 
 if (password.equals(encodeByMD5(inputString))) { 
  return true; 
 } else { 
  return false; 
 } 
} 
   
/** 对字符串进行MD5编码 */ 
private static String encodeByMD5(String originString) { 
 if (originString != null) { 
  try { 
   // 创建具有指定算法名称的信息摘要 
   MessageDigest md = MessageDigest.getInstance("MD5"); 
   // 使用指定的字节数组对摘要进行最后更新,然后完成摘要计算 
   byte[] results = md.digest(originString.getBytes()); 
   // 将得到的字节数组变成字符串返回 
   String resultString = byteArrayToHexString(results); 
   return resultString.toUpperCase(); 
  } catch (Exception ex) { 
   ex.printStackTrace(); 
  } 
 } 
 return null; 
} 
   
/**
 * 轮换字节数组为十六进制字符串
 * 
 * @param b
 *            字节数组
 * @return 十六进制字符串
 */ 
private static String byteArrayToHexString(byte[] b) { 
 StringBuffer resultSb = new StringBuffer(); 
 for (int i = 0; i < b.length; i++) { 
  resultSb.append(byteToHexString(b[i])); 
 } 
 return resultSb.toString(); 
} 
   
/**
 * 将一个字节转化成十六进制形式的字符串
 */ 
private static String byteToHexString(byte b) { 
 int n = b; 
 if (n < 0) 
  n = 256 + n; 
 int d1 = n / 16; 
 int d2 = n % 16; 
 return hexDigits[d1] + hexDigits[d2]; 
} 
   
public static void main(String[] args) { 
 String password = Password.createPassword("huangcheng"); 
 System.out.println("对huangcheng用MD5摘要后的字符串:" + password); 
 String inputString = "huangchenghuangcheng"; 
 System.out.println("huangchenghuangcheng与密码匹配?" 
   + Password.authenticatePassword(password, inputString)); 
 inputString = "huangcheng"; 
 System.out.println("huangcheng与密码匹配?" 
   + Password.authenticatePassword(password, inputString)); 
} 
   
}