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.ivuser.secret_value 的字段类型更改为 BinaryField,或者使用例如 base64 编码器对这些值进行编码。