Django PyCrypto - 将加密字符串保存到数据库错误的Unicode数据

时间:2016-08-09 00:23:13

标签: python django unicode pycrypto

我正在使用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 = 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的错误相同)

我知道这必须与不正确的编码有关。解决这个问题的正确方法是什么?我应该将每个字节转换为字符串字符吗?

感谢。

1 个答案:

答案 0 :(得分:1)

我猜您正在尝试将二进制数据保存到CharField中。要么将user.ivuser.secret_value的字段类型更改为BinaryField,要么使用例如base64编码器对这些值进行编码。