2013-04-22 61 views
1

我正在使用Django捕获一些敏感数据的应用程序,我需要这些数据在数据库中进行加密。我必须使用数据库加密。Django和字段加密与数据库ENCRYPTBYKEY函数

因此,为了节省我的领域,我使用:

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() 

的字段保存在数据库中,但是,当我uncrypt保存在基地中的数据,我得到0x540065007300740020004E0061006D006500,我应该得到0x54657374204E616D65

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

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

回答

1

显然,SQL Server隐式地做了某种字符串转换。

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() 

我通过加密之前铸造的数据为VARCHAR解决我的问题