跳到内容

hashlib-insecure-hash-function (S324)

添加于 v0.0.212 · 相关议题 · 查看源码

源自 flake8-bandit linter。

作用

检查 hashlibcrypt 库中对弱哈希算法或已破解加密哈希函数的使用情况。

为什么这不好?

弱哈希算法或已破解的加密哈希函数可能易受哈希碰撞攻击(即两个不同的输入产生相同的哈希值)或原像攻击(即攻击者可以找到一个能产生给定哈希值的输入)的影响。这可能导致依赖这些哈希函数的应用程序出现安全漏洞。

在涉及安全的环境中,请避免使用弱哈希算法或已破解的加密哈希函数。请改用已知安全的哈希函数,例如 SHA256。

注意:此规则针对 hashlib 中以下弱算法名称:md4md5shasha1。当配置为 METHOD_CRYPTMETHOD_MD5METHOD_BLOWFISH 时,它也会标记对 crypt.cryptcrypt.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

参考