2012-11-26 111 views
4

一家公司需要存儲敏感數據。請現在不要談論證書。瞭解SQL Server加密(通過密碼)?

一個DBA執行以下操作:

CREATE SYMMETRIC KEY SecureSymmetricKey1 
    WITH ALGORITHM = DESX 
    ENCRYPTION BY PASSWORD = N'blabla'; 

一個程序員想要對數據進行加密,並執行以下操作:

-- open key 
    OPEN SYMMETRIC KEY SecureSymmetricKey1 
    DECRYPTION BY PASSWORD = N'blabla' 

    -- actual encrpyt 
    DECLARE @encrypted_str VARBINARY(MAX) 
    SET @encrypted_str = EncryptByKey(Key_GUID('SecureSymmetricKey1'),'my data'); 

另一個程序員想要讓他做讀取數據:

DECLARE @decrypted_str VARBINARY(MAX) 
    SET @decrypted_str = DecryptByKey(...encrypted_str...) 

一切都好。

問題:

  1. 當程序員打開了一個對稱密鑰,他必須在知道密碼。我不認爲程序員應該知道密碼。這怎麼解決?

  2. 如果上帝黑客得到了整個.bak文件,他恢復了自己的家用機上的備份 - 他可以查看它的程序員之一寫的SP,並看到密碼。然後HACKER可以這樣做:

    OPEN SYMMETRIC KEY SecureSymmetricKey1 解密的BY PASSWORD = N'blabla」

我缺少什麼?

感謝您的幫助。

+0

我可以知道你是如何解決這個問題的嗎?我有同樣的困境。 –

回答

2

是否有一個原因,你需要做到這一點時,有encryption in SQL Server本身,你可以在任意打開的所有列或列。

如果你想以你自己的方式創建自己的過程,你可以在創建/修改時使用加密來創建你的過程。這將阻止人們在還原之前或之前從數據庫中提取邏輯。

Create Procedure enc.prMyProcedure With Encryption 
as... 
+0

你不明白我的問題。 –

+0

我想我回答了問題2. 共享密碼的解決方案是使用證書;我不確定你爲什麼不想使用它們。如果你選擇使用密碼,你必須讓人們知道它或給他們一個獲得它的方法。您可以在開發,使用和生產之間始終使用不同的密碼。 – u07ch

+0

我覺得評論失敗了;我會讓它在你的開發系統中不加密;並且當你觸摸真實數據時,在UAT /生產中加密它。我們使用Team Foundation Server以純文本方式掌握我們的過程。其他應用程序可用於執行類似的工作。 – u07ch

1

回答您的問題是: 1)不要使用密碼作爲密鑰。改爲使用數據庫主密鑰加密密鑰。然後使用密碼和服務密鑰加密數據庫主密鑰。程序員仍然需要在加密\解密時編寫OPEN SYMMETRIC KEY SecureSymmetricKey1。但是你不需要告訴他數據庫主密鑰的密碼,因爲他不需要在任何地方寫這個密碼。 當我們不是每次創建對稱密鑰時,密碼只寫入一次。另外,當數據庫主密鑰使用服務密鑰加密時,如果您處於相同的SQL Server實例下,則不必提及用於打開數據庫主密鑰的密碼。

2)如果有人拿你的.bak文件並嘗試打開它,他不能​​,因爲他不能打開數據庫主密鑰沒有密碼。對稱密鑰不會打開沒有數據庫主密鑰。所以如果他運行存儲過程,他什麼都看不到。

我希望有所幫助。