简单聊聊MD5和SHA-256加密

本文介绍了MD5和SHA-256这两种密码散列函数,讨论了它们的特性,包括不可逆性、碰撞问题,并指出SHA-256相对更安全。此外,通过Java的MessageDigest类展示了如何实现MD5和SHA-256的加密过程。

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

1. MD5和SHA-256

  1. MD5和SHA-256都是密码散列函数,加密不可逆,所谓的解密实为暴力破解。
  2. MD5和SHA-256可以实现对任意长度对象加密,这就决定了传入参数类型为byte数组,如果为int或者其他类型,就不能满足上述要求,任何对象都可以被转成byte数组,为了保持通用性而这样设计。
  3. MD5和SHA-256都不能防止碰撞,只是SHA-256碰撞几率小于MD5,这也是MD5被逐渐抛弃的原因,除非被加密的数据并没有那么大的价值才会用MD5加密。

1.1 MD5简介

MD5信息摘要算法,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(哈希值),用于确保信息传输完整一致。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。对于任意长度的消息,这个摘要相当于是个长度为16个字节的数组,通常用一个长度为32的十六进制字符串来表示。找了一个 MD5在线加密工具可以验证自己代码的加密结果。

1.2 SHA-256简介

SHA-256信息摘要算法,也是一种密码散列函数对于任意长度的消息,SHA256都会产生一个256bit长的散列值(哈希值),用于确保信息传输完整一致,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常用一个长度为64的十六进制字符串来表示。找了一个 SHA-256在线加密工具可以验证自己代码的加密结果。

2. Java代码实现

Java代码实现消息加密

public class MyEnCode {
	//Java代码实现MD5消息加密
	public static String MD5(String data) throws Exception {
		//返回实现指定摘要算法的MessageDigest对象
		MessageDigest md = MessageDigest.getInstance("MD5");
		//使用指定的字节更新摘要
		md.update(data.getBytes("UTF-8"));
		//通过执行最后的操作(如填充)来完成哈希计算
		byte[] array = md.digest();
		StringBuilder sb = new StringBuilder();
		//对哈希数进行密码散列计算
		for (byte item : array) {
			sb.append(Integer.toHexString((item & 0xFF)|0x100).substring(1, 3));
		}
		return sb.toString().toUpperCase();
	}
	//Java代码实现SHA-256消息加密
	public static String SHA256(String data) throws Exception {
		//返回实现指定摘要算法的MessageDigest对象。
		MessageDigest md = MessageDigest.getInstance("SHA-256");
		//使用指定的字节更新摘要
		md.update(data.getBytes("UTF-8"));
		//通过执行最后的操作(如填充)来完成哈希计算
		byte[] array = md.digest();
		StringBuilder sb = new StringBuilder();
		//对哈希数进行密码散列计算
		for (byte item : array) {
			sb.append(Integer.toHexString((item & 0xFF)|0x100).substring(1, 3));
		}
		return sb.toString().toUpperCase();
	}
}

测试输出结果

public static void main(String[] args) throws Exception {
	String data = "Af123456";
	System.out.println(MyEnCode.MD5(data));
	String s = "这次的鸡腿真香,哈哈哈,Fighting!";
	System.out.println(MyEnCode.SHA256(s));
}

分别输出32位MD5和64位SHA-256加密后密码

7F4914F213FF9A13BD5706CDE091F546
CDF63F4D1FD3983AF65B793726E8EABB1CE3938CE685637952144C141566EFBE

2.1 MessageDigest类

Java中提供的消息摘要算法功能的类MessageDigest
MessageDigest类为应用程序提供消息摘要算法的功能,如SHA-1或SHA-256。 消息摘要是采用任意大小的数据并输出固定长度散列值的安全单向散列函数。
MessageDigest对象开始初始化。 数据通过它使用update方法进行处理。 在任何时候可以调用reset来重置摘要。 一旦要更新的所有数据都被更新,则应调用其中一个digest方法来完成哈希计算。 对于给定数量的更新,可以调用digest方法一次。 在digest之后,将MessageDigest对象重置为初始化状态。 实现可以实现Cloneable接口。
MessageDigest类内方法
想了解更多MD5、SHA256算法原理可以看下MD5算法底层原理SHA256算法原理详解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值