当前位置:网站首页>【代码扫描修复】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();
}
}
整理完毕,完结撒花~
边栏推荐
- The only way to go from a monthly salary of 10k to 30k: automated testing
- FastCorrect:语音识别快速纠错模型丨RTC Dev Meetup
- resubmit 渐进式防重复提交框架简介
- AcWing 2983. 玩具
- RuoYi-App Startup Tutorial
- Token、Redis实现单点登录
- CKA、CKAD、CKS、KCNA、CFCD考试
- 【UE5 骨骼动画】全形体IK导致Two Bone IK只能斜着移动,不能平移
- MySQL 与InnoDB 下的锁做朋友 (四)行锁/记录锁
- 2022杭电多校第一场(K/L/B/C)
猜你喜欢
随机推荐
谷粒商城-day13-es和商品上架
APT级全面免杀拿Shell
go os 包
基于两级分解和长短时记忆网络的短期风速多步组合预测模型
The latest real software test interview questions are shared. Are you afraid that you will not be able to enter the big factory after collecting them?
严格反馈非线性系统基于事件触发的自抗扰预设有限时间跟踪控制
了解 NFT 质押:Web3 中赚取被动收益的另一种方式
APT level comprehensive free kill with Shell
No code development platform data ID introductory tutorial
openssl源码下载
msys2下载地址
C语言函数详解(2)【函数参数——实际参数(实参)&形式参数(形参)】
group of people
Task 4 Machine Learning Library Scikit-learn
CentOS7 安装MySQL 图文详细教程
最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解
The CTF command execution subject their thinking
threejs 动态调整相机位置,使相机正好能看到对象
MySQL删除数据后,释放磁盘空间
H.265视频流媒体播放器EasyPlayer.js集成时出现“SourceBuffer ”报错,该如何解决?








![[论文总结] 深度学习在农业领域应用论文笔记10](/img/e8/0ba741980495cd81ca30bf269d1111.jpg)
