python 中的 hashlib 有什么方法可以使用 non-openssl md5 吗?

Is there any way to use non-openssl md5 for hashlib in python?

我生成 md5 内容散列用于上传验证,但最近我注意到这对启用 FIPS 的机器上的任何用户 运行 都将失败。 FIPS 禁用 openssl md5,导致在我尝试初始化 hashlib 时出现 ValueError。通常我会改用 SHA,但我依赖于需要 content-md5 header.

的外部服务

我的问题是:有什么方法可以强制 Python 使用 non-openssl 散列函数吗?有一些关于添加 usedforsecurity 标志的讨论 here,但它似乎没有任何进展。

"how can I send a content-md5 header from a FIPS mode machine" 的答案是 启用 FIPS 模式时您不使用 non-FIPS 验证算法 因为您可能会违反联邦法规或这样做的组织政策,因为 FIPS 启用机器的唯一重要原因是是否有监管(或预防政策)要求这样做。

this github issues list中也有一些讨论,建议content-md5必须是可选的。

鉴于监管要求,您不能使用 MD5,因为它不是 FIPS 兼容算法,因此不能有 FIPS 验证(!)实现。

您需要执行以下操作之一:

  • 让该服务不需要 content-md5 header

  • 使用不同的服务

  • 使用不需要处于 FIPS 模式的不同原始机器

如果您的管理层需要参考,请参阅 Annex A Approved Security Functions for FIPS PUB 140-2,直接来自 nist.gov。

Flag usedforsecurity=False 仅适用于某些发行版,因为它不是上游的一部分。您可以在 Red Hat Enterprise Linux 和衍生产品(CentOs、Scientific Linux、Oracle Unbreakable Linux、...)中找到。

您可以自由使用 md5(和其他加密危险散列)仅用于非加密内容,例如使用它来缓存结果。

md5=hashlib.new('md5',usedforsecurity=False) md5.update(data_to_hash) hex=md5.hexdigest()