【密码学】基于Java的MD5加密实现方式

1.什么是MD5

            MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。

2.Java中实现MD5

/**
	 * MD5加密方式(1)
	 * @param message
	 * @return
	 * @throws NoSuchAlgorithmException
	 * @throws UnsupportedEncodingException
	 */
	public static String md5Encode(String message) throws NoSuchAlgorithmException, UnsupportedEncodingException {
		//得到一个信息的摘要器
		MessageDigest digest = MessageDigest.getInstance("MD5");
		byte [] result = digest.digest(message.getBytes("UTF-8"));
		StringBuffer buffer = new StringBuffer();
		//把每一个byte 做一个与运算 0xff
		for(byte b:result) {
			int number = b&0xff;
			String str = Integer.toHexString(number);
			if(str.length()==1) {
				buffer.append("0"); 
			}
			buffer.append(str);
			
		}
		//标准的MD5加密后的结果
		return buffer.toString().toUpperCase();
	}
/**
	 * 普通的MD5加密方式(2)
	 * @param message
	 * @return
	 * @throws UnsupportedEncodingException
	 * @throws NoSuchAlgorithmException
	 */
	public static String publicMd5Encode(String message) throws UnsupportedEncodingException, NoSuchAlgorithmException {
		char [] haxDigests = {'0','1','2','3','4','5','6','7','8','9','A',
				'B','C','D','E','F'};
		byte [] result = message.getBytes("UTF-8");
		//获得MD5摘要算法的 MessageDigest对象
		MessageDigest md5Digest = MessageDigest.getInstance("MD5");
		//使用指定的字节更新摘要
		md5Digest.update(result);
		//获得密文
		byte [] md = md5Digest.digest();
		
		int j = md.length;
		char [] str = new char[j*2];
		int k = 0;
		for(int i=0;i<j;i++) {
			byte byte0 = md[i];
			str[k++] = haxDigests[byte0>>4&0xf];
			str[k++] = haxDigests[byte0&0xf];
		}
		return new String(str);
	}
public static void main(String[] args) {
		String Md5="";
		String pMd5 = "";
		try {
			Md5 = md5Encode("上海");
			pMd5 = publicMd5Encode("上海");
			
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("加密数据失败");
		}
		
		System.out.println("方式1:"+Md5);//E94E8BD35FC8144F38FD1EBC1F81AB36
		System.out.println("方式2:"+pMd5);//E94E8BD35FC8144F38FD1EBC1F81AB36
		
		
	}

注意:message.getBytes("UTF-8"),将字符串变为字节数组的时候,需要设置一个编码格式,如果不设置的很可能导致生成的MD5加密结果与其他人生成的加密结果不一致

参考:https://blog.csdn.net/zjx2016/article/details/75069169/

猜你喜欢

转载自blog.csdn.net/wangli1281/article/details/84784752