【问题标题】:Python hashlib.sha256() digest lengthPython hashlib.sha256() 摘要长度
【发布时间】:2016-06-30 12:48:45
【问题描述】:

我有一些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 key must be either 16, 24, or 32 bytes long

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

如何获取 32 字节长的密钥?

谢谢。

【问题讨论】:

    标签: python aes hashlib


    【解决方案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。

    【讨论】:

      【解决方案2】:

      你需要使用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 )
      

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

      【讨论】:

      • 区别在于hexdigest()返回一个字符串,而digest()返回原始字节。但是,请改用pbkdf2_hmac
      • 感谢您的意见
      猜你喜欢
      • 2015-06-18
      • 1970-01-01
      • 2021-12-10
      • 2014-05-27
      • 1970-01-01
      • 2018-04-10
      • 2016-05-06
      • 1970-01-01
      • 2016-10-31
      相关资源
      最近更新 更多