博客
关于我
Java中使用DigestUtils工具类对数据进行MD5加密
阅读量:806 次
发布时间:2023-03-28

本文共 4740 字,大约阅读时间需要 15 分钟。

MD5加密技术及其应用

引言

MD5算法全称为“消息摘要算法”(Message-Digest Algorithm version.5),是当前公认的强度最高的非对称加密算法之一。它的前身包括MD2和MD4等算法,尽管它们的算法结构有相似之处,但MD2因设计于8位计算机的时代,与MD4和MD5有显著差异,无法简单替代。无论是MD2、MD4还是MD5,它们都通过对任意长度字节串进行处理,生成一个128位的信息摘要。MD5将任意长度的字节串转换为128位大整数,且属于不可逆的字符串变换算法。由于原始字符串具有无穷多种可能,从数学上讲,该算法不存在反函数,这与某些数学函数的特性相似。

Spring自带的DigestUtils工具类

Spring框架为开发者提供了一个强大的工具类——`DigestUtils`,可用于对数据进行加密。该工具类的源码如下:
package org.springframework.util;
import java.io.IOException;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public abstract class DigestUtils {
private static final String MD5_ALGORITHM_NAME = "MD5";
private static final char[] HEX_CHARS = new char[]{
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
public static byte[] md5Digest(byte[] bytes) {
return digest("MD5", bytes);
}
public static byte[] md5Digest(InputStream inputStream) throws IOException {
return digest("MD5", inputStream);
}
public static String md5DigestAsHex(byte[] bytes) {
return digestAsHexString("MD5", bytes);
}
public static String md5DigestAsHex(InputStream inputStream) throws IOException {
return digestAsHexString("MD5", inputStream);
}
public static StringBuilder appendMd5DigestAsHex(byte[] bytes, StringBuilder builder) {
return appendDigestAsHex("MD5", bytes, builder);
}
public static StringBuilder appendMd5DigestAsHex(InputStream inputStream, StringBuilder builder) throws IOException {
return appendDigestAsHex("MD5", inputStream, builder);
}
private static MessageDigest getDigest(String algorithm) {
try {
return MessageDigest.getInstance(algorithm);
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("Could not find MessageDigest with algorithm \"" + algorithm + "\"", e);
}
}
private static byte[] digest(String algorithm, byte[] bytes) {
return getDigest(algorithm).digest(bytes);
}
private static byte[] digest(String algorithm, InputStream inputStream) throws IOException {
MessageDigest messageDigest = getDigest(algorithm);
if (inputStream instanceof UpdateMessageDigestInputStream) {
((UpdateMessageDigestInputStream) inputStream).updateMessageDigest(messageDigest);
return messageDigest.digest();
} else {
byte[] buffer = new byte[4096];
boolean update = true;
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
messageDigest.update(buffer, 0, bytesRead);
}
return messageDigest.digest();
}
}
private static String digestAsHexString(String algorithm, byte[] bytes) {
char[] hexDigest = digestAsHexChars(algorithm, bytes);
return new String(hexDigest);
}
private static String digestAsHexString(String algorithm, InputStream inputStream) throws IOException {
char[] hexDigest = digestAsHexChars(algorithm, inputStream);
return new String(hexDigest);
}
private static StringBuilder appendDigestAsHex(String algorithm, byte[] bytes, StringBuilder builder) {
char[] hexDigest = digestAsHexChars(algorithm, bytes);
return builder.append(hexDigest);
}
private static StringBuilder appendDigestAsHex(String algorithm, InputStream inputStream, StringBuilder builder) throws IOException {
char[] hexDigest = digestAsHexChars(algorithm, inputStream);
return builder.append(hexDigest);
}
private static char[] digestAsHexChars(String algorithm, byte[] bytes) {
byte[] digest = digest(algorithm, bytes);
return encodeHex(digest);
}
private static char[] digestAsHexChars(String algorithm, InputStream inputStream) throws IOException {
byte[] digest = digest(algorithm, inputStream);
return encodeHex(digest);
}
private static char[] encodeHex(byte[] bytes) {
char[] chars = new char[32];
for (int i = 0; i < chars.length; i += 2) {
byte b = bytes[i / 2];
chars[i] = HEX_CHARS[b >>> 4 & 15];
chars[i + 1] = HEX_CHARS[b & 15];
}
return chars;
}
}

应用场景

MD5算法的最经典应用之一是用户密码加密。在许多操作系统中,用户的密码会被以MD5值(或其他类似算法)形式存储。用户登录时,系统会将输入的密码计算成MD5值,与数据库中存储的MD5值进行比较。这种方式使得系统不需要存储原始密码,从而大大提高了安全性。

加密方式

以下是对字符串密码进行MD5加密的示例代码:
String md5Pass = DigestUtils.md5DigestAsHex(password.getBytes());

数据库存值

在数据库中存储加密后的MD5值,可以有效保护用户密码安全。以下是存储过程的示例:
// 假设password是用户输入的原始密码
String md5Hash = DigestUtils.md5DigestAsHex(password.getBytes());
// 存储到数据库中的形式为md5Hash

通过以上方法,可以有效地对用户密码进行MD5加密,并在数据库中存储加密后的值,从而提高系统安全性。

转载地址:http://bdhfk.baihongyu.com/

你可能感兴趣的文章
Objective-C实现文件的删除、复制与重命名操作实例(附完整源码)
查看>>
Objective-C实现无序表查找算法(附完整源码)
查看>>
Objective-C实现无锁链表(附完整源码)
查看>>
Objective-C实现无锁链表(附完整源码)
查看>>
Objective-C实现时间戳转为年月日时分秒(附完整源码)
查看>>
Objective-C实现是否为 Pythagoreantriplet 毕氏三元数组算法(附完整源码)
查看>>
Objective-C实现显示响应算法(附完整源码)
查看>>
Objective-C实现晚捆绑测试实例(附完整源码)
查看>>
Objective-C实现普通矩阵A和B的乘积(附完整源码)
查看>>
Objective-C实现更新数字指定偏移量上的值updateBit算法(附完整源码)
查看>>
Objective-C实现最大和连续子序列算法(附完整源码)
查看>>
Objective-C实现最大的非常大的数字算法(附完整源码)
查看>>
Objective-C实现最大类间方差法OTSU算法(附完整源码)
查看>>
Objective-C实现最大非相邻和算法(附完整源码)
查看>>
Objective-C实现最小二乘多项式曲线拟合(附完整源码)
查看>>
Objective-C实现最小值滤波(附完整源码)
查看>>
Objective-C实现最小公倍数LCM算法(附完整源码)
查看>>
Objective-C实现最小路径和算法(附完整源码)
查看>>
Objective-C实现最快的归并排序算法(附完整源码)
查看>>
Objective-C实现最短路径Dijsktra算法(附完整源码)
查看>>