1

我正在将 Django 用于捕获一些敏感数据的应用程序,并且我需要在数据库中对这些数据进行加密。我必须使用数据库加密。

因此,为了保存我的字段,我使用:

query = """
    OPEN SYMMETRIC KEY MyKey
    DECRYPTION BY CERTIFICATE MyCertificate

    UPDATE mytable
    SET name = ENCRYPTBYKEY(KEY_GUID('MyKey'), %s)
    WHERE id = %s

    CLOSE SYMMETRIC KEY MyKey
"""
args = ["Test Name", data.id]

cursor = connection.cursor()
cursor.execute(query, args)
transaction.commit_unless_managed()

该字段保存在数据库中,但是,当我解密保存在基础中的数据时,我得到0x540065007300740020004E0061006D006500了我应该得到的地方0x54657374204E616D65

有人知道为什么在我的字符串中插入了一些 0x00 字节吗?

我尝试使用 connection.queries[-1] 获取查询字符串并直接在数据库中运行它,当我解密时数据是干净的。

4

1 回答 1

1

显然,SQL Server 正在隐式地进行某种字符串转换。

我通过在加密之前将数据转换为 varchar 解决了我的问题:

query = """
    OPEN SYMMETRIC KEY MyKey
    DECRYPTION BY CERTIFICATE MyCertificate

    UPDATE mytable
    SET name = ENCRYPTBYKEY(KEY_GUID('MyKey'), CAST(%s AS VARCHAR(1023)))
    WHERE id = %s

    CLOSE SYMMETRIC KEY MyKey
"""
args = ["Test Name", data.id]

cursor = connection.cursor()
cursor.execute(query, args)
transaction.commit_unless_managed()
于 2013-04-22T07:07:06.060 回答