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.Security 的getProviders() 办法取得已注册的提供者列表
-
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; } }