哈希算法是使用哈希函数将任意长度的消息映射成为一个长度较短且长度固定的值,这个经过映射的值为哈希值。它是一种单向加密体制,即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程。而不安全的哈希算法则可以逆向推出明文。在密码学中,哈希算法主要用于消息摘要和签名来对整个消息的完整性进行校验,所以需要哈希算法无法推导输入的原始值,这是哈希算法安全性的基础。目前常用的哈希算法包括MD4、MD5、SHA等。本篇文章以JAVA语言源代码为例,分析不安全的哈希算法缺陷产生的原因以及修复方法。详细请参见:CWE ID 327: Use of a Broken or Risky Cryptographic Algorithm ()。
2、 不安全的哈希算法的危害
使用不安全的哈希算法形成数字签名来校验数据源的身份会影响数据的完整性和机密性,导致校验方式失效。
从2018年1月至2019年4月,CVE中共有15条漏洞信息与其相关。部分漏洞如下:
CVE 漏洞概况3、示例代码
示例源于Benchmark (https://www.owasp.org/index.php/Benchmark),源文件名:BenchmarkTest00046.java。
3.1缺陷代码上述示例代码操作是将请求参数转换为哈希值的操作,在第45行获取请求参数 BenchmarkTest00046。在第53行获取一个MD5转换器,在第55行~70行将获取的请求参数值转换为字节数组,第71行将字节数组作为参数传入MD5转换器,第73行获得转换后的字节数组。由于MD5是已经公认已破解的哈希算法,使用该哈希算法来处理数据会损害数据的机密性,导致信息泄露。
使用360代码卫士对上述示例代码进行检测,可以检出“不安全的哈希算法”缺陷,显示等级为低。在代码行第53行报出缺陷,如图1所示:
图1:不安全的哈希算法的检测示例
3.2 修复代码在上述修复代码中,第54行使用SHA-512算法取代MD5算法保证数据完整性和安全性。
使用360代码卫士对修复后的代码进行检测,可以看到已不存在“不安全的哈希算法”缺陷。如图2:
图2:修复后检测结果
4、 如何避免不安全的哈希算法
在安全性要求较高的系统中,应采用散列值>=224比特的SHA系列算法(如SHA-224、SHA-256、SHA-384和SHA-512)来保证敏感数据的完整性。