MD5之学习笔记

MD5是一种广泛使用的散列函数,用于确保数据完整性并提供密码存储的安全性。其唯一性使得在文件下载后可以通过比较MD5值检查文件是否被篡改。在Java中,有多种方法生成MD5摘要,这些摘要通常用于安全验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MD5即Message-Digest Algorithm 5(信息-摘要算法5),提供消息完整性保护的一种散列函数。它像人的指纹一样是唯一的 ,多用于用户登录密码存储以及校验文件在传输过程中是否被修改等。

经常在下载jar包的时候,后边会有一个MD5 的链接

点击MD5进去之后就是一个字符串: 6c10e15835ab214464228a9beb7afba8 *httpd-2.2.31.tar.bz2

在下载完之后可以通过查看文件的MD5值来判断是否被修改

原始数据通过MD5方式形成摘要之后想要找回数据是很困难的,所以安全性高,多数系统和项目在用,下边给出几种通过MD5生成摘要的方式:

 

package test;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.apache.commons.codec.binary.Hex;
import org.apache.commons.codec.digest.DigestUtils;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD5Digest;




public class testMD5 {
	private static String src="study MD5";
	public static void main(String[] args) {
		jdkMD5();
		bcMD5();
		ccMD5();
	}
	public static void jdkMD5(){
		try {
			MessageDigest md=MessageDigest.getInstance("MD5");
			byte[] jdkMd5bytes=md.digest(src.getBytes());
			//byte 数组转换成16进制
			//方式一 :手动写转换16进制的方法
			String dkMd5Str1=bytesToHex(jdkMd5bytes);
			System.out.println("Java MD5:"+dkMd5Str1);
			//引用第三方包 cc
			String dkMd5Str2=Hex.encodeHexString(jdkMd5bytes);
			System.out.println("Java MD5:"+dkMd5Str2);
			
			String dkMd5Str3=bytes2HexString(jdkMd5bytes);
			System.out.println("Java MD5:"+dkMd5Str3);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
	}
	/** 
	 * 字节转换成16进制字符串方法一
	 * @param bytes     
	 * @return     
	 * */    
	public static String bytesToHex(byte[] bytes) {        
		StringBuffer md5str = new StringBuffer();        //把数组每一字节换成16进制连成md5字符串        
		int digital;    
		for (int i = 0; i < bytes.length; i++) {  
			digital = bytes[i];    
			if(digital < 0) {                
				digital += 256;            
				}            
			if(digital < 16){               
				md5str.append("0");            
				}            
			md5str.append(Integer.toHexString(digital));        
		}        
		return md5str.toString().toUpperCase();    
	}
	/** 
	 * 字节转换成16进制字符串方法二
	 * @param bytes     
	 * @return     
	 * */    
	 public static String bytes2HexString(byte[] b) {  
		StringBuffer result = new StringBuffer();  
		String hex;  
		for (int i = 0; i < b.length; i++) {  
		    hex = Integer.toHexString(b[i] & 0xFF);  
		     if (hex.length() == 1) {  
		         hex = '0' + hex;  
		     }  
		     result.append(hex.toUpperCase());  
		 }  
		return result.toString();  
	 }  
	 //BC  引入 bcprov-jdk15.jar
	 public static void bcMD5(){
		 	Digest digest=new MD5Digest();
		 	digest.update(src.getBytes(), 0,src.getBytes().length);
		 	byte[] md5Bytes=new byte[digest.getDigestSize()];
		 	digest.doFinal(md5Bytes, 0);
		 	System.out.println("BC MD5:"+new String(org.bouncycastle.util.encoders.Hex.encode(md5Bytes)));
		 
	 }
	 //CC   引用 commons-codec-1.5.jar
	 public static void ccMD5(){
		 System.out.println("CC MD5:"+DigestUtils.md5Hex(src.getBytes()));
		 
	 }
}


输出结果:

Java MD5:4C6E2253053B1ED9E515EA0FA8F10439
Java MD5:4c6e2253053b1ed9e515ea0fa8f10439
Java MD5:4C6E2253053B1ED9E515EA0FA8F10439
BC    MD5:4c6e2253053b1ed9e515ea0fa8f10439
CC    MD5:4c6e2253053b1ed9e515ea0fa8f10439

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值