首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python fernet: token必须以字节为单位

Python fernet: token必须以字节为单位
EN

Stack Overflow用户
提问于 2021-07-06 19:47:53
回答 1查看 63关注 0票数 0

我想在sqlite3中将值添加到数据库中,并且这些值需要加密。当我想要检索值时,它们需要被解密。现在我得到了这个错误TypeError: token must be bytes。以下是错误的完整列表:Traceback (most recent call last): File "C:\Users\d\OneDrive\Bureaublad\Assignment8\CDMS.py", line 75, in <module> get_clients() File "C:\Users\d\OneDrive\Bureaublad\Assignment8\CDMS.py", line 68, in get_clients new += fernet.decrypt(i).decode() + " " File "C:\Users\d\AppData\Local\Programs\Python\Python38\lib\site-packages\cryptography\fernet.py", line 75, in decrypt timestamp, data = Fernet._get_unverified_token_data(token) File "C:\Users\d\AppData\Local\Programs\Python\Python38\lib\site-packages\cryptography\fernet.py", line 100, in _get_unverified_token_data utils._check_bytes("token", token) File "C:\Users\d\AppData\Local\Programs\Python\Python38\lib\site-packages\cryptography\utils.py", line 29, in _check_bytes raise TypeError("{} must be bytes".format(name)) TypeError: token must be bytes

下面是我的代码:

代码语言:javascript
复制
from Classes import Client
from cryptography.fernet import Fernet
import sqlite3


key = Fernet.generate_key()

fernet = Fernet(key)
conn = sqlite3.connect('database.db')
c = conn.cursor()

def insert_client(client):
    fullname = fernet.encrypt(client.fullname.encode())
    fullname1 = fullname.decode()
    adress = fernet.encrypt(client.adress.encode())
    adress1 = adress.decode()
    zipcode = fernet.encrypt(client.zipcode.encode())
    zipcode1 = zipcode.decode()
    city = fernet.encrypt(client.city.encode())
    city1 = city.decode()
    email = fernet.encrypt(client.email.encode())
    email1 = email.decode()
    mphone = fernet.encrypt(client.mphone.encode())
    mphone1 = mphone.decode()
    
    with conn:
        c.execute("INSERT INTO client VALUES (:fullname, :adress, :zipcode, :city, :email, :mphone)",
          {'fullname': fullname1, 'adress': adress1, 'zipcode': zipcode1,
           'city': city1, 'email': email1, 'mphone': mphone1})

client1 = Client('Name1', 'Street1', 'Zipcode', 'NewYork', '123@gmail.com', '12345678')

def get_clients():
    arr = []
    new = ""
    c.execute("SELECT * FROM client")
    arr = c.fetchall()
    for i in arr:
        new += fernet.decrypt(i).decode() + " "
    return new
        


insert_client(client1)
get_clients()


conn.close()

第一个函数用于通过名为Client的类对象添加客户端。第二个函数用于检索解密的所有值。

EN

回答 1

Stack Overflow用户

发布于 2021-07-06 20:29:24

fetchall返回可迭代的行(最常见的是元组)。如果只想处理一条记录,则应该改用fetchone

代码语言:javascript
复制
...
arr = c.fetchone()
for i in arr:
    new += fernet.decrypt(i).decode() + " "
...

或者,您可以迭代游标并返回一个列表:

代码语言:javascript
复制
def get_clients():
    arr = []
    c.execute("SELECT * FROM client")
    for row in c:
        new = ""
        for i in row:
            new += fernet.decrypt(i).decode() + " "
        arr.append(new)
    return arr

但是Pythonic的方法是使用理解:

代码语言:javascript
复制
def get_clients():
    c.execute("SELECT * FROM client")
    return [' '.join(fernet.decrypt(i).decode() for i in row)
            for row in c]

稍微短一点,不是吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68270002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档