python - 我如何从 Python 中的 hashlib.sha256 派生?

标签 python security cryptography

天真的尝试惨遭失败:

import hashlib

class fred(hashlib.sha256):
    pass

-> TypeError: Error when calling the metaclass bases
       cannot create 'builtin_function_or_method' instances

嗯,原来 hashlib.sha256 是一个可调用的,而不是一个类。尝试一些更有创意的东西也不起作用:

 import hashlib

 class fred(type(hashlib.sha256())):
     pass

 f = fred

 -> TypeError: cannot create 'fred' instances

嗯...

那么,我该怎么做呢?

这是我真正想要实现的:

class shad_256(sha256):
    """Double SHA - sha256(sha256(data).digest())
Less susceptible to length extension attacks than sha256 alone."""
    def digest(self):
        return sha256(sha256.digest(self)).digest()
    def hexdigest(self):
        return sha256(sha256.digest(self)).hexdigest()

基本上我希望一切都通过,除非有人要求结果我想插入我自己的额外步骤。有没有一种巧妙的方法可以使用 __new__ 或某种元类魔术来完成此操作?

我有一个解决方案,我很满意我发布的答案,但我真的很想看看是否有人能想到更好的方法。要么更简洁,可读性成本非常低,要么更快(特别是在调用 update 时),同时仍然具有一定的可读性。

更新:我进行了一些测试:

# test_sha._timehash takes three parameters, the hash object generator to use,
# the number of updates and the size of the updates.

# Built in hashlib.sha256
$ python2.7 -m timeit -n 100 -s 'import test_sha, hashlib' 'test_sha._timehash(hashlib.sha256, 20000, 512)'
100 loops, best of 3: 104 msec per loop

# My wrapper based approach (see my answer)
$ python2.7 -m timeit -n 100 -s 'import test_sha, hashlib' 'test_sha._timehash(test_sha.wrapper_shad_256, 20000, 512)'
100 loops, best of 3: 108 msec per loop

# Glen Maynard's getattr based approach
$ python2.7 -m timeit -n 100 -s 'import test_sha, hashlib' 'test_sha._timehash(test_sha.getattr_shad_256, 20000, 512)'
100 loops, best of 3: 103 msec per loop

最佳答案

创建一个新类,从对象派生,在 init 中创建一个 hashlib.sha256 成员变量,然后定义散列类所需的方法并代理到成员变量的相同方法。

类似于:

import hashlib

class MyThing(object):
    def __init__(self):
        self._hasher = hashlib.sha256()

    def digest(self):
        return self._hasher.digest()

其他方法依此类推。

关于python - 我如何从 Python 中的 hashlib.sha256 派生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4029632/

相关文章:

javascript - 如何让JavaScript从Django中的views.py中识别context_dict对象

python - 如何通过 stripe python api 创建定期费用?

python - 有人注册时如何在gae上正确存储密码?

线程上的 Java 安全管理器

cryptography - SSL,根据编码消息获得解码消息长度的上限

python - 获取单词与字典映射的所有结果

security - 网络安全

php - 在php中下载安全相关问题

delphi - 如何使用 Delphi 对字符串进行哈希处理?

validation - 我应该采取哪些步骤来像浏览器一样手动验证 SSL 证书?