当前位置:网站首页>【代码扫描修复】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();
}
}
整理完毕,完结撒花~
边栏推荐
猜你喜欢
无代码开发平台表单样式设置步骤入门课程
00 -- jieba分词
Learn more TypeScript 】 【 TypeScript modular
谷粒商城-day13-es和商品上架
CKA、CKAD、CKS、KCNA、CFCD考试
【斯坦福计网CS144项目】Lab5: NetworkInterface
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?
如何通过 IDEA 数据库管理工具连接 TDengine?
Mysql查看慢查询日志
同样月薪6K,为什么同事跳槽月薪翻倍,而你只涨了1000?
随机推荐
Strict feedback nonlinear systems based on event trigger preset since the immunity of finite time tracking control
Kubernetes 进阶训练营 网络
B站回应“HR 称核心用户都是 Loser”:该面试官去年底已被劝退,会吸取教训加强管理
在软件测试行业近20年的我,再来和大家谈谈今日的软件测试
创建型模式 - 抽象工厂模式AbstractFactory
VS保存后Unity不刷新
在迁移测试中,源表、中间表、目标表的迁移规则
ssm整合(三)Controller 和 视图层编写
Image recognition from zero to write DNF script key points
matplotlib绘图的核心原理讲解(超详细)
MySQL 用id分库使用name查询
go exec 包
Towards a General Purpose CNN for Long Range Dependencies in ND
vscode 自定义快捷键——设置eslint
gdb调试简要总结
Teach you how to kill if else
函数:计算组合数
【斯坦福计网CS144项目】Lab5: NetworkInterface
最新真实软件测试面试题分享,收藏了还怕进入不了大厂?
C语言函数详解(2)【函数参数——实际参数(实参)&形式参数(形参)】