• MD5加密Java版


    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)); 
    } 
       
    }
  • 相关阅读:
    PowerMock 遇到的问题——2
    PowerMock遇到的问题——3
    PowerMock使用遇到的问题——2
    PowerMock使用遇到的问题——1
    PowerMock使用遇到的一些问题
    PowerMock.expectNew(Class<T> type, Class<?>[] parameterTypes, Object... arguments)
    PowerMock与EasyMock的应用(转)
    EasyMock的原理及使用方法
    一个div相对于外层的div水平和垂直居中
    SAP 采购订单收货时报错:对于采购订单xxxx无收货可能
  • 原文地址:https://www.cnblogs.com/kanyinqing/p/5006707.html
Copyright © 2020-2023  润新知