1. MD5和SHA-256
- MD5和SHA-256都是密码散列函数,加密不可逆,所谓的解密实为暴力破解。
- MD5和SHA-256可以实现对任意长度对象加密,这就决定了传入参数类型为byte数组,如果为int或者其他类型,就不能满足上述要求,任何对象都可以被转成byte数组,为了保持通用性而这样设计。
- 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接口。
想了解更多MD5、SHA256算法原理可以看下MD5算法底层原理 、SHA256算法原理详解