使用Java的MessageDigest实现MD5加密算法

md5工具使用方法(安卓md5校验工具apk)(1)

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工具使用方法(安卓md5校验工具apk)(2)

字符串的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;	}	}