前言:
我确实搜索了 StackOverflow,我知道有人有像我这样的问题,但现在(第一次看到它几个月后),我再也找不到那个答案了。我完全知道可能存在重复,但对于我的一生,我无法在搜索中找到它。
问题:
我有一个加密模块,它生成一个散列密码,用于加密和解密存储在 TinyDB 数据库中的秘密。除了解密秘密外,所有功能都有效。密码验证正确,所以我知道这不是问题。我几乎肯定我的问题是在解密函数中正确编码盐。
加密代码:
pas = use_password(args[0])
salt = urandom(16)
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),length=32,salt=salt,iterations=100000,)
sec = base64.b64encode(kdf.derive(bytes(pas,'utf-8')))
token = Fernet(sec).encrypt(bytes(key,'utf-8'))
salt = base64.b64encode(salt).decode('utf-8')
return token, salt
解密:
pas = use_password(pw)
***salt = base64.b64decode(salt)***
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),length=32,salt=salt,iterations=100000,)
sec = base64.b64encode(kdf.derive(bytes(pas,'utf-8')))
# BUG: Reported defects -@ctrenthem at 7/26/2021, 8:07:00 PM: cryptography.fernet.InvalidToken error
key = Fernet(sec).decrypt(bytes(token,'utf-8'))
return key # Returns a byte object which may need to be converted to a string.
我尝试了什么:
我已经尝试过复制盐加密的不同变体,但不断出错。部分问题是base64.encode需要两个“文件对象”用于输入和输出,并且不接受字符串变量,这使得它无法满足我的需要。
我可以通过创建一个临时文件来解决这个问题,但这将是最糟糕的解决方案,因为它涉及
- 在文件系统中使用部分解密的信息在 RAM 和数据库之外创建一个新文件,从而削弱整个系统的安全性
- 创建一个新的临时文件,这只是浪费系统资源
- 添加更多代码只是为了实现一些我很肯定的东西,可以用一两个词以不同的方式实现。
尽管知道还有另一种解决方案,但我无法弄清楚,并且不知道哪个 base64 或 bytes 函数将完成这项工作。