【代码扫描修复】MD5加密弱HASH漏洞

漏洞描述:

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();
    }
}

整理完毕,完结撒花~

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿放下技术的小赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值