2013-04-22 62 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解決我的問題