所以我的问题是,我加密了一些密码,将它存储在我的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
答案 0 :(得分:0)
由于您有字节作为输入,并且您希望将其存储为字符串,您可以先使用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')
。这是因为字节类型可以包含空字节,如b'\0'
,如果在字符串中找到它,它可能不适合某些系统。
为了安全使用base64,您需要字节的字符串表示。它不是特定于Python的。例如,图像是基础64,直接包含在html页面中。它被称为data URLs