无法在 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
所以我的问题是,我加密了一些密码,像这样将其存储在我的 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