使用多轮AES加密的bcrypt口令?

0 投票
1 回答
634 浏览
提问于 2025-04-17 13:19

我正在尝试写一个简单的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 个回答

1

我不能评论安全性,但如果你想要真正的32个字节的SHA256值,你需要调用 digest,而不是 hexdigesthexdigest 会返回一个十六进制的字符串表示(也就是64个字符)。

撰写回答