具有多轮AES加密的bcrypt密码?

时间:2013-01-21 22:27:50

标签: python encryption aes bcrypt sha256

我正在尝试编写一个简单的Python解决方案,使用密码来安全地加密文件。我想我会使用类似bcryptpbkdf2的东西,这样随着时间的推移,我可以让我的密码哈希越来越难以暴力破解。我还认为我会使用AES进行实际加密,因为它是一个非常安全的标准。我没有修改加密密码,但我真的很喜欢bcrypt

我很难确定如何实际执行加密。假设我有一个密码和一个我想要加密的文件。我认为我基本上需要做这样的事情:

from Crypto.Cipher import AES
from bcrypt import gensalt, hashpw
from hashlib import sha256

def encryptify(passphrase, file_name):
    target_file = open(file_name, 'r')

    # generate password, takes time
    passphrase_rounds = 15
    passphrase_salt = gensalt(rounds)
    passphrase = sha256(hashpw(passphrase, passphrase_salt)).hexdigest()

    # encrypt the file
    encrypted_file = AES.new(passphrase, AES.MODE_CBC).encrypt(target_file.read())

在最后一步,它以ValueError失败,告诉我我的密钥长度必须是16,24或32字节。我不理解的是,我正在做的事情是否安全以及为什么最后一步失败了。我以为SHA256输出32个字符的数据?

我特别关注使用bcrypt密码并将其抛出sha256,这样做是否有潜在的安全风险?我不会这么想,但话说回来,我不是密码学家。

1 个答案:

答案 0 :(得分:1)

我无法对安全性发表评论,但如果您想要实际的32字节SHA256,则需要拨打digest,而不是hexdigesthexdigest返回十六进制字符串表示形式(即64个字符)。