0

前言:

我确实搜索了 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需要两个“文件对象”用于输入和输出,并且不接受字符串变量,这使得它无法满足我的需要。

我可以通过创建一个临时文件来解决这个问题,但这将是最糟糕的解决方案,因为它涉及

  1. 在文件系统中使用部分解密的信息在 RAM 和数据库之外创建一个新文件,从而削弱整个系统的安全性
  2. 创建一个新的临时文件,这只是浪费系统资源
  3. 添加更多代码只是为了实现一些我很肯定的东西,可以用一两个词以不同的方式实现。

尽管知道还有另一种解决方案,但我无法弄清楚,并且不知道哪个 base64 或 bytes 函数将完成这项工作。

4

0 回答 0