Java 语言实现 MD5 加密
背景说明
在实际项目中,为了安全性考虑,经常要求账号密码是以加密后的密文形式,保存到数据库中。
这样,即使有人获取到了数据库中的密文密码,也不知道明文密码信息是什么,从而防止系统被恶意访问。
密码加密有很多种方式,比如:Base64,DSA,RSA,MD5,SHA128,SHA256,SHA512等加密方式。
本文主要讲述 MD5 加密方式。
MD5 简介
MD5 消息摘要算法(英文:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。
MD5应用
数据加密
利用它的单向加密性,即不可逆性,我们可以应用于数据和密码的加密。
由于MD5算法的单向性,由MD5码计算出原文几乎是不可能的。目前对于这种加密方法的破解方式是收集常用的密码形式,例如生日,身份证号,电话号码等。把这些收集到的秘密用MD5处理之后进行存储,然后与需要还原的MD5进行比对,当收集的数据达到一定的数目,用户密码被破解的可能性就会变得很大。
对于这种方法,一种加强安全性的方法就是在对用户密码进行MD5处理的时候在原密码上加一个附近值,例如原密码为“password”,处理的时候变为“passworddrowssap”,经过这样的处理之后可以有效降低密码被破解的可能性。
确认文件是否被篡改
每个文件都可以计算出一个特定的 MD5 值。
比如,我们上传一个文件到服务器上,可以同时计算出该文件对应的 MD5 值;
在文件下载的时候,通过再次计算该文件的 MD5 值。
如果两个MD5值相同,说明文件没有变化,否则,说明文件被修改过。
Java 语言实现 MD5 加密
通过Java编写程序,实现对任意字符串进行 MD5 加密。
第一版代码(初始版)
代码如下:
package com.miracle.luna.md5;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* Created by Miracle Luna on 2019/11/18
*/
public class Md5UtilOriginal {
/**
* 将数据进行 MD5 加密,并以16进制字符串格式输出
* @param data
* @return
*/
public static String md5(String data) {
try {
byte[] md5 = md5(data.getBytes("utf-8"));
return toHexString(md5);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "";
}
/**
* 将字节数组进行 MD5 加密
* @param data
* @return
*/
public static byte[] md5(byte[] data) {
try {
MessageDigest md = MessageDigest.getInstance("md5");
return md.digest(data);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return new byte[]{};
}
/**
* 将加密后的字节数组,转换成16进制的字符串
* @param md5
* @return
*/
private static String toHexString(byte[] md5) {
StringBuilder sb = new StringBuilder();
System.out.println("md5.length: " + md5.length);
for (byte b : md5) {
sb.append(Integer.toHexString(b & 0xff));
}
return sb.toString();
}
public static void main(String[] args) {
String password = "password";
String md5HexStr = md5(password);
System.out.println("==> MD5 加密前: " + password);
System.out.println("==> MD5 加密后: " + md5HexStr);
}
}
java
运行结果如下:
md5.length: 16
==> MD5 加密前: password
==> MD5 加密后: 5f4dcc3b5aa765d61d8327deb882cf99
shell
第二版代码(精简版)
代码如下:
package com.miracle.luna.md5;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* Created by Miracle Luna on 2019/11/18
*/
public class Md5UtilSimple {
/**
* 将数据进行 MD5 加密,并以16进制字符串格式输出
* @param data
* @return
*/
public static String md5(String data) {
StringBuilder sb = new StringBuilder();
try {
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5 = md.digest(data.getBytes(StandardCharsets.UTF_8));
// 将字节数据转换为十六进制
for (byte b : md5) {
sb.append(Integer.toHexString(b & 0xff));
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sb.toString();
}
public static void main(String[] args) {
String password = "password";
String md5HexStr = md5(password);
System.out.println("==> MD5 加密前: " + password);
System.out.println("==> MD5 加密后: " + md5HexStr);
}
}
java
运行结果如下:
==> MD5 加密前: password
==> MD5 加密后: 5f4dcc3b5aa765d61d8327deb882cf99
shell
第三版代码(最终优化版)
代码如下:
package com.miracle.luna.md5;
// 此处需要引入 commons-codec-1.13.jar
import org.apache.commons.codec.binary.Hex;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* Created by Miracle Luna on 2019/11/18
*/
public class Md5Util {
/**
* 将数据进行 MD5 加密,并以16进制字符串格式输出
* @param data
* @return
*/
public static String md5(String data) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
return Hex.encodeHexString(md.digest(data.getBytes(StandardCharsets.UTF_8)));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return "";
}
public static void main(String[] args) {
String password = "password";
String md5HexStr = md5(password);
System.out.println("==> MD5 加密前: " + password);
System.out.println("==> MD5 加密后: " + md5HexStr);
}
}
java
运行结果如下:
==> MD5 加密前: password
==> MD5 加密后: 5f4dcc3b5aa765d61d8327deb882cf99
shell
commons-codec-1.13.jar 的 pom 引用如下:
<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.13</version>
</dependency>
xml