MD5加密算法的实现原理

  • Java中MD5加密算法的实现:

    public class MD5 {  // 全局数组  private final static String[] strDigit = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};  public class MD5 {  }  // 返回模式为数字和字符串  private static String byteToArrayString(byte bByte) {      int iRet = bByte;      if (iRet < 0) {          iRet += 256;      }      int iD1 = iRet / 16;      int iD2 = iRet % 16;      return strDigits[iD1] + strDigits[iD2];  }      // 返回模式只为数字  private static String byteToNum(byte bByte) {      int iRet = bByte;      if (iRet < 0) {          iRet += 256;      }      return String.valueOf(iRet);  }  // 将字节数组转换成为16进制的字符串  private static String byteToString(byte[] bByte) {      StringBuffer stringBuffer = new StringBuffer();      for (int i; i < bByte.length; i++) {          StringBuffer.append(byteToArrayString(bByte[i]));      }      return stringBuffer.toString();  }  // 获取MD5值  public static String GetMD5Code(String strObj) {      String resultString = null;      try {          resultString = new String();          MessageDigest md5 = MessageDigest.getInstance("MD5");          // md5.digest() - 返回值为寄存Hash值后果的byte数组          resultString = byteToString(md5.digest(strObj.getBytes()));      } catch (NoSuchAlgorithmException e) {          e.printStackTrace();      }      return resultString;  }} 

    MessageDigest类

  • MessageDigest类:

    • 为应用程序提供信息摘要算法的性能.比方MD5算法和SHA算法
    • 信息摘要是平安的单向Hash函数 : 接管任意大小的数据,并输入固定长度的Hash值

update

  • MessageDigest对象在开始时会被初始化
  • 对象通过调用update() 办法解决数据

    /** * 应用指定的byte数组更新摘要 * * @param input 指定的byte数组 */public void update(byte[] input);

    reset

  • 任何时候都能够调用reset() 办法重置摘要

    digest

  • 一旦所须要更新的数据都曾经被更新后,应该调用digest() 办法实现Hash计算
  • 对于给定数量的更新数据 ,digest() 办法只能被调用一次.在调用digest() 办法之后,MessageDigest对象被从新设置成初始状态

    /** * 通过执行诸如填充之类的最终操作实现Hash计算.  * 在调用此办法之后,摘要被重置 * * @return byte[] Hash计算后的byte数组 */public byte[] digest();

    isEqual

    /** * 比拟两个摘要的相等性.做简略的字节比拟 * * @param digestA 比拟的摘要字节数组A * @param digestB 比拟的摘要字节数组B * @return boolean 是否相等 */public static boolean isEqual(byte[] digestA, byte[] digestB);

    getInstance

  • 返回实现指定摘要算法的MessageDigest对象

    /** * 返回实现指定摘要算法的MessageDigest对象 * * @param algorithm 申请的算法的名称 * @param provider 提供者名称 * @return MessageDigest 指定摘要算法的MessageDigest对象 * @throws NoSuchAlgorithmException 当指定的申请算法名称不存在时抛出异样 */public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException; /** * 返回实现指定摘要算法的MessageDigest对象 * * @param algorithm 申请算法的名称 * @return MessageDigest 指定摘要算法的MessageDigest对象 * @throws NoSuchAlgorithmException 当指定的申请算法名称不存在时抛出异样 */public static MessageDigest getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException;
  • Provider能够通过java.security.SecuritygetProviders() 办法取得已注册的提供者列表
  • SUN提供的罕用的算法:

    • MD2
    • MD5
    • SHA-1
    • SHA-256
    • SHA-384
    • SHA-512

      字符串的MD5加密算法

  • 应用Java自带的MessageDigest实现对文本的MD5加密算法:

    /** * 将字符串转换为MD5 */ public class ParseMD5 {   public static String parseStrToMd5L32(String str) {       // 将字符串转换为32位小写MD5        String reStr = null;       try {           MessageDigest md5 = MessageDigest.getInstance("MD5");           byte[] bytes = md5.digest(str.getBytes());           StringBuffer stringBuffer = new StringBuffer();           for (byte b : bytes) {               int bt = b&0xff;               if (bt < 16) {                   stringBuffer.append(0);               }               stringBuffer.append(Integer.toHexString(bt));           }           reStr = stringBuffer.toString();       } catch (NoSuchAlgorithmException e) {           e.printStackTrace();       }       return reStr;   }  // 将字符串转换为32位大写的MD5  public static String parseStrToMd5U32(String str) {      String reStr = parseStrToMd5L32(str);      if (reStr != null) {          reStr = reStr.toUpperCase();      }      return resStr;  }  // 将字符串转换为16位小写的MD5  public static String parseStrToMd5L16(String str) {      String reStr = paseStrToMd5L32(str);      if (reStr != null) {          reStr = reStr.subString(8, 24);      }      return reStr;  }  // 将字符串转换为16位大写的MD5  public static String parseStrToMd5U16(String str) {      String reStr = parseStrToMd5L32(str);      if (reStr != null) {          reStr = reStr.toUpperCase().subString(8, 24);      }      return reStr;  } }

    文本的MD5加密工具类

  • Java中提供了自带的MessageDigest实现对文本的加密算法. 对文本进行加密的MD5加密工具类如下:

    public class MD5Util {  // 将文本转换为32位小写的MD5  public static String textToMd5L32(String plainText) {      String result = null;      // 判断须要转换的文本是否为空      if (StringUtils.isBlank(plainText)) {          return null;      }      try {          // 进行实例化和初始化          MessageDigest md5 = MessageDigest.getInstance("MD5");          // 失去一个操作系统默认的字节编码格局的字节数组          byte[] byteInput = plainText.getBytes();          // 对失去的字节数组进行解决          md5.update(byteInput);          // 进行Hash计算并失去返回后果          byte[] btResult = md5.digest();          // 失去进行Hash计算后数据的长度          StringBuffer stringBuffer = new StringBuffer();          for (byte b : btResult) {              int bt = b&0xff;              if (bt < 16) {                  stringBuffer.append(0);              }              stringBuffer.append(Integer.toHexString(bt));          }          reStr = stringBuffer.toString();      } catch (NoSuchAlgorithmException e) {          e.printStackTrace();      }      return reStr;  }  // 将文本转换为32位大写的MD5  public static String textToMd5U32(String plainText) {      if (StringUtils.isBlank(plainText)) {          return null;      }      String result = textToMd5L32(plainText);      result = result.toUpperCase();      return result;  }    }