当前位置:网站首页>【代码扫描修复】MD5加密弱HASH漏洞
【代码扫描修复】MD5加密弱HASH漏洞
2022-08-02 22:29:00 【ACGkaka_】
漏洞描述:
MD2、MD4、MD5、RIPEMD-160 和 SHA-1 是常用的加密散列算法,通常用于验证消
息和其他数据的完整性。然而,由于最近的密码分析研究揭示了这些算法中存在的根本缺
陷,因此它们不应该再用于安全性关键的上下文中。
由于有效破解 MD 和 RIPEMD 散列的技术已得到广泛使用,因此不应该依赖这些算法来
保证安全性。对于 SHA-1,目前的破坏技术仍需要极高的计算能力,因此比较难以实现。
然而,攻击者已发现了该算法的致命弱点,破坏它的技术可能会导致更快地发起攻击。
原理、风险及预防
弱加密散列值无法保证数据完整性,且不能在安全性关键的上下文中使用。
示例
修复建议: 停止使用 MD2、MD4、MD5、RIPEMD-160 和 SHA-1 对安全性关键的上下
文中的数据进行验证。
目前,SHA-224、SHA-256、SHA-384、SHA-512 和 SHA-3 都是不错的备选方案。
但是,由于安全散列算法 (Secure Hash Algorithm) 的这些变体并没有像 SHA-1 那样得
到仔细研究,因此请留意可能影响这些算法安全性的未来研究结果。
解决方案:
涉及依赖:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.12</version>
</dependency>
代码示例:
import org.apache.commons.codec.digest.DigestUtils;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Test {
/** 盐长度 */
private static final Integer SALT_LENGTH = 12;
public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
String password = "123333";
byte[] salt = new byte[SALT_LENGTH];
// ### 原加密方式 ###
MessageDigest md = null;
// 创建消息摘要
md = MessageDigest.getInstance("MD5");
// 将盐数据传入消息摘要对象
md.update(salt);
// 将口令的数据传给消息摘要对象
md.update(password.getBytes("UTF-8"));
// 获得消息摘要的字节数组
String result1 = byteToHexString(md.digest());
// result1: 85C030CF20F6F65CD6DF8CCDDD61AC67
System.out.println("result1: " + result1);
// ### 优化后加密方式 ###
// 扩容数组,密码字节长度+盐字节长度,不扩容会数组越界
byte[] pwd = new byte[password.getBytes().length + SALT_LENGTH];
// 将salt复制到数组中
System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);
// 将password复制到数组中
System.arraycopy(password.getBytes(), 0, pwd, SALT_LENGTH, password.getBytes().length);
// 将数据加密,加密后的byte[]转为16进制字符串
String result2 = DigestUtils.md5Hex(pwd).toUpperCase();
// result2: 85C030CF20F6F65CD6DF8CCDDD61AC67
System.out.println("result2: " + result2);
// result: true
System.out.println("result: " + result1.equals(result2));
}
/** * 将指定byte数组转换成16进制字符串 * * @param b 字节数组 * @return 16进制字符串 */
private static String byteToHexString(byte[] b) {
StringBuilder hexString = new StringBuilder();
for (byte value : b) {
String hex = Integer.toHexString(value & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
hexString.append(hex.toUpperCase());
}
return hexString.toString();
}
}
整理完毕,完结撒花~
边栏推荐
猜你喜欢
学习基因富集工具DAVID(2)
[论文总结] 深度学习在农业领域应用论文笔记10
matplotlib绘图的核心原理讲解(超详细)
B站回应HR称用户是Loser:涉事面试官去年底已被劝退
2022暑假牛客多校1 (A/G/D/I)
FastCorrect:语音识别快速纠错模型丨RTC Dev Meetup
一个很少见但很有用的SQL功能
目前为止 DAO靠什么盈利?
I have been in the software testing industry for nearly 20 years, let me talk to you about today's software testing
WebShell 木马免杀过WAF
随机推荐
Go语言如何操作文件
B站回应“HR 称核心用户都是 Loser”:该面试官去年底已被劝退,会吸取教训加强管理
无代码开发平台数据ID入门教程
1 - vector R language self-study
Jmeter二次开发实现rsa加密
同样月薪6K,为什么同事跳槽月薪翻倍,而你只涨了1000?
CWE4.8:2022年危害最大的25种软件安全问题
Yocto系列讲解[实战篇]85 - 制作ubi镜像和自动挂载ubifs文件系统
MySQL 与InnoDB 下的锁做朋友 (四)行锁/记录锁
The only way to go from a monthly salary of 10k to 30k: automated testing
Kubernetes 进阶训练营 网络
AcWing 2983. 玩具
MySQL 用id分库使用name查询
虚拟内存 virualmemory
辅助脚本开发之旅
resubmit 渐进式防重复提交框架简介
kubernetes pod podsecurityPolicies(PSP)
go 序列化与反序列化
TDengine 在中天钢铁 GPS、 AIS 调度中的落地
Teach you how to kill if else