无法在 rethinkDB 中存储字节

Can't store bytes in rethinkDB

所以我的问题是,我加密了一些密码,像这样将其存储在我的 rethinkDB 中:

"b'bytesandstuff'"

但是如果我检索它并尝试解码它,它会因为字符串不是字节而崩溃,解决这个问题的最简单方法是什么?

此外,我认为我不需要为此提供代码,但无论如何我都会这样做

main.py

from passgen import encryptPass, decryptPass

global decpass
encpass = loginquery.get("password")
decpass = decryptPass(encpass)

passgen.py

from cryptography.fernet import Fernet

key = "mySecretKey"
f = Fernet(key)

def decryptPass(rawstring):
    decrypted = f.decrypt(rawstring)
    converted = decrypted.decode('utf8')

    return converted

编辑:我正在使用 Python 3.6.4

编辑 2:一条记录​​如下所示:RethinkDB Sample Record

由于您有字节作为输入并且希望将其存储为字符串,因此您可以先使用 base64.b64encode 将其编码为 base 64,然后在存储到 rethinkdb 之前解码 ascii 中的字符串。

In [1]: import base64

In [2]: encrypted_message_as_returned_by_fernet = b'c0ffee'

In [3]: still_bytes = base64.b64encode(encrypted_message_as_returned_by_fernet)

In [4]: string = still_bytes.decode('ascii')

In [5]: type(string)
Out[5]: str

In [6]: # do the reverse operation before decyphering the thing

In [7]: base64.b64decode(string.encode('ascii'))
Out[7]: b'c0ffee'

问题是为什么你不能简单地做 encrypted_message_as_returned_by_fernet.decode('ascii')。这是因为 bytes 类型可以包含像 b'[=13=]' 这样的空字节,如果在字符串中找到它,它可能无法在某些系统中正常运行。

为了安全起见,只要您需要字节的字符串表示形式,就请使用 base64。这不是 Python 具体的。例如,图像是 base 64,可以直接包含在 html 页面中。它被称为data URLs