我正在使用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的错误相同)
我知道这必须与不正确的编码有关。解决这个问题的正确方法是什么?我应该将每个字节转换为字符串字符吗?
感谢。
答案 0 :(得分:1)
我猜您正在尝试将二进制数据保存到CharField
中。要么将user.iv
和user.secret_value
的字段类型更改为BinaryField
,要么使用例如base64编码器对这些值进行编码。