当前位置:网站首页>【代码扫描修复】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(3)
- 虚拟内存 virualmemory
- threejs 动态调整相机位置,使相机正好能看到对象
- Based on two levels of decomposition and the length of the memory network multi-step combined forecasting model of short-term wind speed
- openssl源码下载
- 数字化转型巨浪拍岸,成长型企业如何“渡河”?
- Strict feedback nonlinear systems based on event trigger preset since the immunity of finite time tracking control
- 学习Autodock分子对接
- 谷粒商城-day14-商城业务与压力测试
- TCP三次握手与四次挥手
猜你喜欢
用大白话解释“什么是ERP?” 看完这篇就全明白了
2022杭电多校第一场(K/L/B/C)
Towards a General Purpose CNN for Long Range Dependencies in ND
万物智联时代,悄然走入生活
centos7安装mysql5.7步骤(图解版)
[TypeScript] Deep Learning of TypeScript Classes (Part 1)
Week 7 CNN Architectures - LeNet-5、AlexNet、VGGNet、GoogLeNet、ResNet
CKA、CKAD、CKS、KCNA、CFCD考试
你离「TDengine 开发者大会」只差一条 SQL 语句!
【使用pyside2遇到的问题】This application failed to start because no Qt platform plugin could be initialized.
随机推荐
一群搞社区的人
2022暑假牛客多校1 (A/G/D/I)
创建型模式 - 单例模式Singleton
【TypeScript】深入学习TypeScript类(下)
openssl源码下载
严格反馈非线性系统基于事件触发的自抗扰预设有限时间跟踪控制
APT level comprehensive free kill with Shell
Image recognition from zero to write DNF script key points
【斯坦福计网CS144项目】Lab5: NetworkInterface
Matplotlib drawing core principles explain (more detailed)
Software testing pen questions 1 (with answers)
The only way to go from a monthly salary of 10k to 30k: automated testing
软件测试笔试题1(附答案)
在迁移测试中,源表、中间表、目标表的迁移规则
【TypeScript】深入学习TypeScript模块化
Auto.js实现朋友圈自动点赞
虚拟内存 virualmemory
Technology Sharing | How to do assertion verification for xml format in interface automation testing?
Broadcast platform, the use of the node generated captcha image, and validate
谷粒商城-day14-商城业务与压力测试