MD5加密算法

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的RonaldL.Rivest开发出来,经MD2、MD3和MD4发展而来。

MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。 
   MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。 
  MD5还广泛用于加密和解密技术上,在很多操作系统中,用户的密码是以MD5值(或类似的其它算法)的方式保存的, 用户Login的时候,系统是把用户输入的密码计算成MD5值,然后再去和系统中保存的MD5值进行比较,而系统并不“知道”用户的密码是什么。
一个完整的md5加密算法如下:
/**
 * 对密码进行加密和验证的程序
 */
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加密。
	 * @param inputString	待加密的字符串
	 * @return
	 */
	public static String createPassword(String inputString){
		return encodeByMD5(inputString);
	}
	/**
	 * 验证输入的密码是否正确
	 * @param password		真正的密码(加密后的真密码)
	 * @param inputString	输入的字符串
	 * @return
	 */
	public static boolean authenticatePassword(String password, String inputString){
		if (password.equals(encodeByMD5(inputString))){
			return true;
		} else {
			return false;
		}
	}


	/**
	 * 对字符串进行MD5编码
	 * @param originString
	 * @return
	 */
	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;
	}
	
	/**
	 * 转换字节数组为16进制字串
		 * @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();
	}


	/**
	 * 将一个字节转化成16进制形式的字符串
	 * @param b
	 * @return
	 */
	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("888888");
		System.out.println("对888888用MD5摘要后的字符串:" + password);
		String inputString = "8888";
		System.out.println("8888与密码匹配?" + Password.authenticatePassword(password, inputString));
		inputString = "888888";
		System.out.println("888888与密码匹配?" + Password.authenticatePassword(password, inputString));
	}
}

相信你已经对MD5加密算法有一定了解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值