Python hashlib.sha256()摘要长度

时间:2016-06-30 12:48:45

标签: python aes hashlib

我有一些python代码,

 hash_object = hashlib.sha256(b'Hello World')
 hex_dig = hash_object.hexdigest()

 cipher = AES.new(hex_dig, AES.MODE_CBC, iv)
 plain = cipher.decrypt( cipher )

但是,我有一个错误 - ValueError:AES密钥必须是16,24或32字节长

但是,我想要32字节密钥,而不是16字节密钥。 我不知道为什么hash_val = hashfct.digest()不是32bytes 另外,我试过" hash_val = hashfct.digest()[0:32]"但它也不起作用。

如何获得32byte长密钥?

感谢。

2 个答案:

答案 0 :(得分:1)

您应该考虑使用正确的密钥派生算法,而不是自己编写。 PBKDF2是一种比较常见的算法,它可以保护您免受一些常见错误的影响。例如,在您的情况下,很容易强制密码,因为您只进行了一轮散列。

以下是hashlib的一些修改后的示例代码:

>>> import hashlib
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> dk[:32]
b'\x03\x94\xa2\xed\xe32\xc9\xa1>\xb8.\x9b$c\x16\x04\xc3\x1d\xf9x\xb4\xe2\xf0\xfb\xd2\xc5I\x94O\x9dy\xa5'

每次生成新密钥时,您还应确保b'salt'是随机的并且不同。有关Python中的加密安全随机函数,请参阅How can I create a random number that is cryptographically secure in python?

这适用于Python 3,但应该足够简单以适应Python 2。

答案 1 :(得分:0)

您需要使用digest方法

hash_object = hashlib.sha256(b'Hello World')
hex_dig = hash_object.digest()

cipher = AES.new(hex_dig, AES.MODE_CBC, iv)
plain = cipher.decrypt( cipher )

我真的不知道原因,但这有效,因为我遇到了同样的问题。