保存ciph的连续字节无效

2024-06-09 12:25:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我要创建并保存以下密码:

def create_credential(self):
    des = DES.new(CIPHER_N, DES.MODE_ECB)
    text = str(uuid.uuid4()).replace('-','')[:16]
    cipher_text = des.encrypt(text)
    return cipher_text      

def decrypt_credential(self, text):
    des = DES.new(CIPHER_N, DES.MODE_ECB)
    return des.decrypt(text)

def update_access_credentials(self):
    self.access_key = self.create_credential()
    print repr(self.access_key) # "\xf9\xad\xfbO\xc1lJ'\xb3\xda\x7f\x84\x10\xbbv&"
    self.access_password = self.create_credential()
    self.save()

我会打电话给:

^{pr2}$

这是我得到的stacktrace:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xf5 in position 738: invalid start byte

为什么会发生这种情况?我该如何避开它?在


Tags: textselfnewreturnaccessmodedefcreate
3条回答

发生这种情况是因为您试图在文本字段中保存非文本数据。或者使用非文本字段,或者通过例如Base-64编码将数据编码为文本。在

您正在将bytestring存储到Unicode数据库字段中,因此它将尝试解码为Unicode。在

要么使用可以存储不透明二进制数据的数据库字段,要么显式解码为Unicode(拉丁语-1将字节一对一映射到Unicode码位),要么将数据包装成可以存储为文本的表示形式。在

例如,对于django1.6及更高版本,使用^{}。对于早期版本,使用二进制到文本的转换(例如Base64)比解码拉丁语-1更好;后者的结果不会给您有意义的文本数据,但Django可能会尝试这样显示(例如在管理界面中)。在

此处使用base64编码和解码修复了此问题:

import base64

def create_credential(self):
    des = DES.new(CIPHER_N, DES.MODE_ECB)
    text = str(uuid.uuid4()).replace('-','')[:16]
    cipher_text = des.encrypt(text)
    base64_encrypted_message = base64.b64encode(cipher_text)
    return base64_encrypted_message     

def decrypt_credential(self, text):
    text = base64.b64decode(text)
    des = DES.new(CIPHER_N, DES.MODE_ECB)
    message = des.decrypt(text)
    return message

相关问题 更多 >