【哈希加密算法】MD5和SHA-1基本介绍和使用!

一、哈希算法

 哈希算法,根据碰撞概率,输出的长度越长,就越难产生碰撞,也就越安全。

常用的哈希算法如下: 

【哈希加密算法】MD5和SHA-1基本介绍和使用!_第1张图片

(1)哈希算法的用途

  1. 数据加密:哈希算法可以将原始数据转换成不可逆的加密字符串,这个字符串被称为哈希值。哈希值可以用于保护数据的隐私,因为无法通过哈希值推导出原始数据。

  2. 密码存储:哈希算法可以用于保护密码的存储。通过将密码转换为哈希值并存储哈希值,可以防止攻击者获取用户密码。当用户登录时,输入的密码将与保存的哈希值进行比对,如果匹配则允许用户登录。

  3. 校验文件的下载。

总之,哈希算法在数据安全、数字证书、数字签名等领域都有广泛的应用。

一、MD5

MD5是一种计算机算法,用于将任意长度的数据(消息)压缩成一个128位(16字节)的哈希值。MD5算法常用于数据完整性校验、数字签名、密码存储等领域。

MD5算法具有以下特点:

  1. 压缩性:任意长度的数据,算出的MD5值长度都是固定的。
  2. 唯一性:不同的输入数据会产生不同的输出。
  3. 不可逆性:无法通过MD5值反推出原始数据。
  4. 抗修改性:对数据进行微小的修改,MD5值的变化也会很大。

(1)对字符串进行编码

public class Demo01 {
	public static void main(String[] args) throws NoSuchAlgorithmException {
		//创建基于MD5算法的消息摘要对象
		MessageDigest md5=MessageDigest.getInstance("MD5");
		
		//更新原始数据
		md5.update("博得明月出,用兰花换锦服".getBytes());
		
		//获取加密后的结果
		byte[] digestBytes=md5.digest();
		System.out.println("加密后的结果(字节数组):"+Arrays.toString(digestBytes));
		System.out.println("加密后的结果(16进制字符串):"+HashTools.bytesToHex(digestBytes));
		System.out.println("加密结果的长度:"+digestBytes.length);
	}
}

 加密后的结果(字节数组):[-78, 36, -54, 29, 82, 49, -85, -24, 87, -39, 102, 14, -4, 73, -83, -32]
加密后的结果(16进制字符串):b224ca1d5231abe857d9660efc49ade0
加密结果的长度:16

(2)对图片进行加密 

//按照MD5算法对图片进行加密
public class Demo03 {
	public static void main(String[] args) throws IOException, NoSuchAlgorithmException {
		//图片的原始字节内容
		byte[] imageBuf=Files.readAllBytes(Paths.get("D:\\test\\20230521\\mao1.jpg"));
		
		//创建基于算法的消息摘要对象
		MessageDigest md5=MessageDigest.getInstance("MD5");
		
		//原始字节内容
		md5.update(imageBuf);
		
		//获取加密摘要
		byte[] digestBytes=md5.digest();
		System.out.println("加密后的结果(字节数组):"+Arrays.toString(digestBytes));
		System.out.println("加密后的结果(16进制字符串):"+HashTools.bytesToHex(digestBytes));
		System.out.println("加密结果的长度:"+digestBytes.length);  //MD5算法的固定输出长度为16个字节	
	}

}

加密后的结果(字节数组):[-90, 35, 17, 98, 5, 9, -60, 116, -53, -119, -32, -68, 43, -65, 66, 105]
加密后的结果(16进制字符串):a62311620509c474cb89e0bc2bbf4269
加密结果的长度:16

三、SHA-1

SHA-1是一种加密算法,全称为Secure Hash Algorithm 1。它旨在产生一个160位(20字节)的消息摘要,以提供数据的完整性保护。

public class Demo04 {
	public static void main(String[] args) throws NoSuchAlgorithmException {
		//原始密码
		String password="xdsqczkyqs";
		
		//产生随机的盐值
		String salt=UUID.randomUUID().toString().substring(0,4);
		
		//创建基于SHA-1算法的消息摘要对象
		MessageDigest sha1=MessageDigest.getInstance("SHA-1");
		sha1.update(password.getBytes());
		sha1.update(salt.getBytes());
		
		
		//计算加密结果SHA-1的输出结果为20个字节(40)
		String digestHex=HashTools.bytesToHex(sha1.digest());
		System.out.println("加密结果:"+digestHex);
	}

}

 加密结果:d98902bdfdf050316c28487caf5b358377a4cb23

你可能感兴趣的:(java,开发语言)