无法在rethinkDB中存储字节

时间:2018-01-13 14:46:51

标签: python 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

1 个答案:

答案 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