摘要:最近后端学习中涉及使用MD5算法保存密码数据,简单记录以备后续查阅!
????????有些重要数据的存储往往需要考虑安全风险,例如密码明文,为增强安全性可对密码使用md5算法进行保护。
MD5(Message-Digest Algorithm 5是一种广泛使用的摘要算法,用于生成消息摘要以验证消息的完整性。MD5 算法的输入是一个字符串,输出是一个128位的二进制字符串。
????????MD5 算法的原理是通过对输入字符串进行一系列的变换,将字符串转换为一个固定长度的摘要。这些变换包括:
????????MD5 算法的优点是简单、高效、易于实现,但存在一些安全问题,如碰撞攻击、哈希碰撞等。因此,在实际应用中,MD5 算法已经逐渐被 SHA-1、SHA-256 等更安全的摘要算法所取代,这几种算法也可借鉴MD5的实现来处理。
? ? ? ? MD5加密的实现如下,使用字符串Constant.SALT(盐)来增加加密的复杂度和安全性:
/**
* 描述: MD5工具
*/
public class MD5Utils {
// 工具类使用static定义可方便其他类调用
public static String getMD5Str(String strValue) throws NoSuchAlgorithmException {
MessageDigest md5= MessageDigest.getInstance("MD5");
// 字符串和常量Constant.SALT拼接成新的字符串。调用getBytes()方法将该字符串转换为字节数组
return Base64.encodeBase64String(md5.digest((strValue+ Constant.SALT).getBytes()));
}
//用这个方法测试生成的md5的值
public static void main(String[] args) {
String md5=null;
try {
md5 = getMD5Str("1234");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
System.out.println(md5);
}
}
Constant.java
/**
* 常量值
* 为增强算法破解难度,使用常量字符串加盐
*/
public class Constant {
public static final String SALT ="8svbsvjkweDF,.03[";
}
? ? ? ? 上述代码,MessageDigest.getInstance()方法用于获取指定算法类型的MessageDigest实例。MessageDigest是一个抽象类,它提供了加密散列算法的实现,如MD5、SHA-1、SHA-256等。MessageDigest.getInstance()方法接收一个算法名称作为参数,例如"MD5"、"SHA-1"等。该方法会根据提供的算法名称创建一个MessageDigest实例,并返回该实例。如果提供的算法名称无效,该方法将抛出一个NoSuchAlgorithmException异常。
?MessageDigest(消息摘要算法)是一种加密散列算法,用于确保数据的完整性。在计算机领域,消息摘要通常用于验证数据是否被篡改、确保数据的完整性以及防止未经授权的访问。这些算法可以将数据转换为摘要字符串,以便于验证数据的完整性。
? ? ? ?对于需要存储到数据库的重要数据,调用MD5Utils.getMD5Str()方法先加密再存储,过程如下:
// 写到数据库
User user = new User();
user.setUsername(userName);
// 数据库存储的密码需要加密,则先使用MD5工具类MD5Utils加密后再存储
try {
user.setPassword(MD5Utils.getMD5Str(password));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}