• 【代码扫描修复】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-codecgroupId>
        <artifactId>commons-codecartifactId>
        <version>1.12version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    代码示例:

    
    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();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    整理完毕,完结撒花~

  • 相关阅读:
    spring boot酒店会员点餐系统毕业设计源码072005
    C语言学习(八)之指针
    websocketpp的回调函数解析
    2023武汉纺织大学计算机考研信息汇总
    【五】sql 语言 -- 概览
    【总结卡】clickhouse数据库常用高级函数
    8.1标识框架
    Shell脚本基本语法
    掌动智能:UI自动化测试工具的重要性和应用
    Java生产者消费者模式
  • 原文地址:https://blog.csdn.net/qq_33204709/article/details/126110823