【问题标题】:Encoding a tuple or dict in Python?在 Python 中编码元组或字典?
【发布时间】:2018-06-03 12:27:26
【问题描述】:

我正在使用加密模块加密一些数据,然后尝试将其存储在我的 SQL 数据库中。当它是一个字符串时,它可以工作。但是,当我尝试使用元组或字典时,它会失败。我有以下作为被调用的函数。 (使用 crypytography.Fernet.encrypt)。

def encrypt(to_encrypt):
    ''' Takes a bytestring and returns a token. '''
    key = get_key()
    f = make_fernet_object(key)
    token = f.encrypt(to_encrypt)
    return token

如果我尝试将元组或字典直接传递给它,我会得到 ​​p>

TypeError:数据必须是字节。

如果我使用

bytes(my_tuple)

然后我得到

TypeError: 'str' 对象不能被解释为整数

如何将我的元组(包含 2 个字符串和一个 dict)转换为 Fernet 将加密的字节对象,以便我可以将 blob 放入我的 SQL 数据库中?

edit - 有问题的元组采用格式..

my_tuple = ('username', 'password', {'memorable question':'memorable answer', 'memorable question 2', 'memorable answer 2'})

【问题讨论】:

  • 您必须 encode() 字符串才能转换为字节,例如你可以bytes(str(my_tuple).encode('utf-8')),但很难说这是否符合你的要求。
  • @AChampion str(my_tuple) 将产生元组文字的字符串表示,可能不是 OP 所想的。 (我假设只有元组的内容很重要。)
  • 很可能,不清楚 OP 想要什么 - 他提到了 blob,所以想知道他是否想稍后恢复元组,也许应该使用 repr()
  • 有没有考虑pickle所以序列化对象?
  • 抱歉,不够清晰。最终,我试图将元组的内容(在答案中定义)存储在数据库中,然后能够稍后检索它以访问其各个部分。我没有被困在一个元组上,一个列表就可以了。我只是想我应该使用元组,因为内容永远不会改变。 str(my_tuple) 有效,但之后我必须进行字符串操作以检索各个部分。对于用户名 + 密码来说这很容易,但对于 dict 来说就更难了。

标签: python python-3.x dictionary tuples byte


【解决方案1】:

正如您的错误消息所说,encrypt 只接受字节作为输入。您可以将字符串格式化为字节,但不能将元组格式化为 python 对象的序列。您可以将元组中包含的两个字符串中的任何一个传递给bytes(),或者将它们分隔并连接为单个字符串并传递它,但您不能传递元组本身(不指定将其转换为字符串并恢复的方法)将字符串表示为元组)。

https://cryptography.io/en/latest/_modules/cryptography/fernet/

【讨论】:

    猜你喜欢
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2015-07-22
    • 2019-03-17
    • 1970-01-01
    • 2018-02-23
    相关资源
    最近更新 更多