hashlib-insecure-hash-function (S324)
源自 flake8-bandit linter。
作用
检查 hashlib 和 crypt 库中对弱哈希算法或已破解加密哈希函数的使用情况。
为什么这不好?
弱哈希算法或已破解的加密哈希函数可能易受哈希碰撞攻击(即两个不同的输入产生相同的哈希值)或原像攻击(即攻击者可以找到一个能产生给定哈希值的输入)的影响。这可能导致依赖这些哈希函数的应用程序出现安全漏洞。
在涉及安全的环境中,请避免使用弱哈希算法或已破解的加密哈希函数。请改用已知安全的哈希函数,例如 SHA256。
注意:此规则针对 hashlib 中以下弱算法名称:md4、md5、sha 和 sha1。当配置为 METHOD_CRYPT、METHOD_MD5 或 METHOD_BLOWFISH 时,它也会标记对 crypt.crypt 和 crypt.mksalt 的使用。
它不会尝试检查 OpenSSL 或平台特定的别名和 OID(例如:"sha-1"、"ssl3-sha1"、"ssl3-md5" 或 "1.3.14.3.2.26"),也不会检查带有尾随空格的变体,因为所接受的别名集取决于底层的 OpenSSL 版本,并且在不同的平台和 Python 构建版本中会有所不同。
示例
import hashlib
def certificate_is_valid(certificate: bytes, known_hash: str) -> bool:
hash = hashlib.md5(certificate).hexdigest()
return hash == known_hash
建议改为
import hashlib
def certificate_is_valid(certificate: bytes, known_hash: str) -> bool:
hash = hashlib.sha256(certificate).hexdigest()
return hash == known_hash
或者,如果哈希算法未用于安全环境(例如作为非加密的单向压缩函数),请添加 usedforsecurity=False 参数。
import hashlib
def certificate_is_valid(certificate: bytes, known_hash: str) -> bool:
hash = hashlib.md5(certificate, usedforsecurity=False).hexdigest()
return hash == known_hash