当前位置:网站首页>【代码扫描修复】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();
}
}
整理完毕,完结撒花~
边栏推荐
- 2022暑假牛客多校1 (A/G/D/I)
- Learn more TypeScript 】 【 TypeScript modular
- msys2下载地址
- go 反射 reflect 包
- 【UE5 骨骼动画】全形体IK导致Two Bone IK只能斜着移动,不能平移
- kubernetes pod podsecurityPolicies(PSP)
- MDL 内存描述符链表
- 了解 NFT 质押:Web3 中赚取被动收益的另一种方式
- No code development platform data ID introductory tutorial
- Broadcast platform, the use of the node generated captcha image, and validate
猜你喜欢
随机推荐
ssm整合(三)Controller 和 视图层编写
2022暑假牛客多校1 (A/G/D/I)
一群搞社区的人
qt静态编译出现Project ERROR: Library ‘odbc‘ is not defined
ZCMU--5230: 排练方阵(C语言)
辅助脚本开发之旅
CTF命令执行题目解题思路
第十章 时序与延迟
No-code development platform form styling steps introductory course
MDL 内存描述符链表
Week 7 - Distributional Representations
测试人生 | 阿里实习 90 天:从实习生的视角谈谈个人成长
买母婴产品先来京东“券民空间站”抢券!大牌好物低至5折
Image recognition from zero to write DNF script key points
go 序列化与反序列化
go os 包
If the watermark according to how to realize the function
目前为止 DAO靠什么盈利?
创建型模式 - 简单工厂模式StaticFactoryMethod
最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解









