Java 中的 MD5 和 SHA 哈希

MD5 是麻省理工学院 Ronaled Rivest 教授开发的一系列算法之一(Rivest,1994 年)。当工作表明 MD4 可能不安全时,MD5 被设计为取代 MD4。MD4 的弱点后来被 Hans Dobbertin 发现.
SHA 哈希函数是由美国国家安全局 (NSA) 设计的。SHA 代表 安全哈希算法。这三种 SHA 算法的结构不同,分别以 SHA-0、SHA-1 和 SHA-2 区分。SHA-2 系列使用相同的算法,具有可变摘要大小,由 SHA-224、SHA-256、SHA-384 和 SHA-512.
本教程介绍如何使用两种哈希方法 MD5 和 SHA-256 对字符串进行哈希处理,出于安全原因,通常使用密码。哈希只允许你在一个方向上编码,这是它最大的优势,所以哈希是不可逆的,不像加密,它使用密钥进行加密和解密。

使用 MD5

在此示例中,我们使用 MD5.

import java.security.MessageDigest;

public class md5_java
{
public static void main(String[] args)throws Exception
{
String password = 123456789”;

MessageDigest md = MessageDigest.getInstance(MD5”);
md.update(password.getBytes());

字节 byteData[] = md.digest();

//将位数组转换为十六进制格式 - 方法 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}

System.out.println(十六进制格式: ” + sb.toString());

//将bitarray转换为十六进制格式 - method 2
StringBuffer hexString = new StringBuffer();
表示 (int i=0;我<字节数据长度;i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(十六进制);
}
System.out.println(十六进制格式: ” + hexString.toString());
}
}
输出:

 
十六进制格式:25f9e794323b453885f5181f1b624d0b
十六进制格式:25f9e794323b453885f5181f1b624d0b

为什么我们要用SHA-256而不是MD5

MD5的安全性已经严重受损, 它的弱点在当地得到了利用。使用 MD5 作为密码是一个坏主意,因为它不是一种安全的方式。您应该始终对敏感数据(如用户密码)使用 SHA.

import java.security.MessageDigest;

public class sha_java
{
public static void main(String[] args)throws Exception
{
String password = 123456789”;

MessageDigest md = MessageDigest.getInstance(SHA-256”);
md.update(password.getBytes());

字节 byteData[] = md.digest();

//将位数组转换为十六进制格式 - 方法 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}

System.out.println(十六进制格式: ” + sb.toString());

//将bitarray转换为十六进制格式 - method 2
StringBuffer hexString = new StringBuffer();
表示 (int i=0;我<字节数据长度;i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(十六进制);
}
System.out.println(十六进制格式: ” + hexString.toString());
}
}
输出:

 
十六进制格式:15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225
十六进制格式:15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225

References:
https://en.wikipedia.org/wiki/MD5
https://en.wikipedia.org/wiki/Secure_Hash_Algorithm
MD5 作为密码哈希函数有多弱?