Sql Django和带有数据库ENCRYPTBYKEY功能的字段加密

Sql Django和带有数据库ENCRYPTBYKEY功能的字段加密,sql,django,encryption,Sql,Django,Encryption,我将Django用于捕获一些敏感数据的应用程序,我需要在数据库中对这些数据进行加密。我必须使用数据库加密 因此,为了保存字段,我使用: query = """ OPEN SYMMETRIC KEY MyKey DECRYPTION BY CERTIFICATE MyCertificate UPDATE mytable SET name = ENCRYPTBYKEY(KEY_GUID('MyKey'), %s) WHERE id = %s CLO

我将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()
该字段保存在数据库中,但当我取消对base中保存的数据的加密时,我会得到
0x540065007300740020004E0061006D006500
,我应该从中得到
0x54657374204E616D65

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


我尝试使用connection.querys[-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()

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

我通过在加密之前将数据强制转换为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()