m0_54212618 2024-12-04 23:08 采纳率: 66.7%
浏览 4
已结题

python中hashlib如何确保不被篡改?

在python中会使用hashlib来进行加密操作,但是如何确保hsahlib模块不被篡改呢?
比如我在软件中使用hashlib去验证一个文件是否被修改了,于是我在mian.py中import hashlib,然后使用hashlib.md5()生成一个摘要。
然后我把软件发布给客户,如果客户修改了软件,则会被检测出来,这极大的依赖hashlib模块,如果客户篡改了hashlib模块文件,那我的检测则失败了。
我在python中查询了源码,发现hashlib.py文件和平常代码不一样,(摘取部分如下),想找到hashlib到底依赖那些文件,以便进一步保护这些文件,防止hashlib被篡改,但是发现import了_md5、_sha 等文件,这些文件在我当前的解释环境中是不存在的,但是运行软件却没有报错。
真是搞不懂。
故请教:如何确保hashlib不被篡改?

algorithms_guaranteed = set(__always_supported)
algorithms_available = set(__always_supported)

__all__ = __always_supported + ('new', 'algorithms_guaranteed',
                                'algorithms_available', 'pbkdf2_hmac')


__builtin_constructor_cache = {}

# Prefer our blake2 implementation
# OpenSSL 1.1.0 comes with a limited implementation of blake2b/s. The OpenSSL
# implementations neither support keyed blake2 (blake2 MAC) nor advanced
# features like salt, personalization, or tree hashing. OpenSSL hash-only
# variants are available as 'blake2b512' and 'blake2s256', though.
__block_openssl_constructor = {
    'blake2b', 'blake2s',
}

def __get_builtin_constructor(name):
    print('__get_builtin_constructor')
    cache = __builtin_constructor_cache
    constructor = cache.get(name)
    if constructor is not None:
        print('return',name,constructor)
        return constructor
    print('other',name)
    try:
        if name in {'SHA1', 'sha1'}:
            import _sha1
            cache['SHA1'] = cache['sha1'] = _sha1.sha1
        elif name in {'MD5', 'md5'}:
            print('md5')
            import _md5
            cache['MD5'] = cache['md5'] = _md5.md5
        elif name in {'SHA256', 'sha256', 'SHA224', 'sha224'}:
            import _sha256
            cache['SHA224'] = cache['sha224'] = _sha256.sha224
            cache['SHA256'] = cache['sha256'] = _sha256.sha256
        elif name in {'SHA512', 'sha512', 'SHA384', 'sha384'}:
            import _sha512
            cache['SHA384'] = cache['sha384'] = _sha512.sha384
            cache['SHA512'] = cache['sha512'] = _sha512.sha512

  • 写回答

1条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    确保Python中的hashlib库不被篡改的方法与保护任何关键代码段类似,主要是通过确保代码的完整性和可信度。以下是一些建议的方法:

    1. 使用官方源代码编译Python解释器:确保从官方源获取Python解释器的源代码,并自行编译。这样可以确保内置的库(如hashlib)是未被修改的。
    2. 数字签名和校验:对Python解释器和所有依赖库进行签名,并在安装时进行校验。这确保了文件的完整性和可信度。如果文件被修改,签名将会失效。
    3. 代码混淆和加密:虽然这不是一个常见的做法,但对于关键代码段(如hashlib的使用),你可以考虑使用代码混淆或加密技术来保护它们。但这会增加维护的复杂性,并可能引入新的安全风险。
    4. 依赖管理:确保你的应用依赖的库都是来自官方源,并使用可信赖的包管理工具(如pip)进行安装。避免从不受信任的源获取库。
    5. 定期检查更新:随着软件的发展,可能会发现新的漏洞或攻击方式。定期检查Python和其库的更新,并及时修复已知的安全问题。
    6. 操作系统级别的保护:在操作系统级别上,可以设置特定的权限和访问控制来限制对Python解释器和库的修改。例如,可以使用SELinux或其他安全策略来限制文件的访问权限。
    7. 文档和审计:确保对代码进行充分的文档说明,并进行定期的审计,以检查任何潜在的安全风险或漏洞。

    关于你提到的hashlib模块中的特定代码段,那些是Python的内置实现或是依赖其他库(如OpenSSL)的实现细节。通常,你不会直接修改这些文件,因此你主要应该关注的是如何确保整个Python环境和依赖库的安全性。如果你确信hashlib的使用是关键的安全点,那么重点应该放在确保其依赖库和整个运行环境的安全性上。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月16日
  • 已采纳回答 12月8日
  • 创建了问题 12月4日