Django PyCrypto - 将加密字符串保存到数据库错误的 Unicode 数据
Django PyCrypto - Save Encrypted String to Database Bad Unicode Data
我在 Django 中使用 PyCrypto,我需要使用他们自己制作的用户密钥来加密字符串。我成功写了一个加密方法如下:
from Crypto.Cipher import AES
from Crypto.Random import get_random_string
def encrypt(value, key):
"""
Return an encryption of value under key, as well as IV.
Pads value with extra bytes to make it multiple of 16.
"""
extra = 16 - (len(value) % 16)
data = value + chr(extra) * extra
iv = get_random_bytes(16)
encryption_suite = AES.new(key, AES.MODE_CBC, iv)
cipher_text = encryption_suite.encrypt(data)
return cipher_text, iv
为什么我不使用 Django 的加密?因为有一个客户端应用程序不是用 Django 编写的(而且永远不会),它接受用户之前存储的加密值,并在用户输入他们的密钥后解密它。
问题是我似乎无法将加密值保存到用户模型的数据库中。例如:
user = User.objects.get(id=user_id)
cipher, iv = encrypt(user_value, user_key)
user.secret_value = cipher
user.iv = iv
user.save()
这会导致此错误:
Warning: Incorrect string value: '\xE7\xAA\x13\x036\xC8...' for column 'iv' at row 1
(secret_value 的相同错误)
我知道这一定与编码不当有关。解决这个问题的正确方法是什么?我应该将每个字节转换成字符串字符吗?
谢谢。
我猜您正试图将二进制数据保存到 CharField
中。将 user.iv
和 user.secret_value
的字段类型更改为 BinaryField
,或者使用例如 base64 编码器对这些值进行编码。
我在 Django 中使用 PyCrypto,我需要使用他们自己制作的用户密钥来加密字符串。我成功写了一个加密方法如下:
from Crypto.Cipher import AES
from Crypto.Random import get_random_string
def encrypt(value, key):
"""
Return an encryption of value under key, as well as IV.
Pads value with extra bytes to make it multiple of 16.
"""
extra = 16 - (len(value) % 16)
data = value + chr(extra) * extra
iv = get_random_bytes(16)
encryption_suite = AES.new(key, AES.MODE_CBC, iv)
cipher_text = encryption_suite.encrypt(data)
return cipher_text, iv
为什么我不使用 Django 的加密?因为有一个客户端应用程序不是用 Django 编写的(而且永远不会),它接受用户之前存储的加密值,并在用户输入他们的密钥后解密它。
问题是我似乎无法将加密值保存到用户模型的数据库中。例如:
user = User.objects.get(id=user_id)
cipher, iv = encrypt(user_value, user_key)
user.secret_value = cipher
user.iv = iv
user.save()
这会导致此错误:
Warning: Incorrect string value: '\xE7\xAA\x13\x036\xC8...' for column 'iv' at row 1
(secret_value 的相同错误)
我知道这一定与编码不当有关。解决这个问题的正确方法是什么?我应该将每个字节转换成字符串字符吗?
谢谢。
我猜您正试图将二进制数据保存到 CharField
中。将 user.iv
和 user.secret_value
的字段类型更改为 BinaryField
,或者使用例如 base64 编码器对这些值进行编码。