【发布时间】:2018-10-03 12:50:47
【问题描述】:
在我的 Django 应用程序中,我想使用 mysql 数据库中的 AES_ENCRYPT 和 AES_DECRYPT 来加密和解密内容。
我知道 python 的 Crypto 包支持 AES,但 Crypto AES 不会产生与 mysql AES 相同的结果,尽管我确保两者都使用 ECB 模式。
所以,现在我正在这样做:
sql = "select 1 as id, AES_ENCRYPT(my_field, '16-bytes encryption key') as field_enc from appname_table"
encrypted_fields = MyModel.objects.raw(sql)
这让我得到加密后的字段值,它工作正常。问题是AES算法加密最终结果有很多不可打印的字符,看起来像这样:
encrypted_fields[3].field_enc
'\x88\xc5\xe4\xa0c?\xf8\x16|^1JB\x83{\xdf'
print(encrypted_fields[3].field_enc)
���c?�|^1JB�{�
所以,现在当我尝试用这个相同的值来解密它时,mysql 会回复一个错误,上面写着
"OperationalError: (1300, "无效的 utf8 字符串: '\x88\xC5\xE4\xA0c'")"
我猜这是因为我试图向 mysql 查询发送不可打印的字符。
那么,我该如何处理呢?
请注意,我必须使用 MySQL 函数,因为我使用这些函数加密了一些数据库字段,所以我需要使用相同的函数解密它们,因为 Crypto 的 AES 没有得到相同的结果。 Crypto 一直要求要加密的文本必须像密钥一样长 16 个字节,而 mysql 不需要。
我还尝试查看 mysql 在加密之前是否对文本使用某种填充,但它没有说明他们在 webpage 上填充了什么字符:
str 和 crypt_str 参数可以是任意长度,填充是 自动添加到 str,因此它是所需的块的倍数 通过基于块的算法,例如 AES。这个填充是自动的 由 AES_DECRYPT() 函数删除
【问题讨论】:
标签: mysql django encryption aes pycrypto