2013-10-24 78 views
0

我有一個人力資源解決方案,最近我們對數據庫的工資進行了加密。 我已經創建了一個2 C#函數,進行加密和解密。數據庫級別的數據加密

我在SQL命令和我們使用的程序中遇到了一個關於SQL SUM,MAX,MIN函數的問題,我們用的非常多。

作爲一個解決方案,我創建了2個sql clr函數在數據庫中使用它們,但問題是這些2個clr函數可以被任何有權訪問數據庫並可以使用這些函數的主體訪問。

我想爲這些2 clr函數更復雜的東西,所以我想這個函數不應該工作,除非來自我的應用程序的調用。 我正在考慮在連接字符串的應用程序名稱中傳遞一些內容並檢查內部clr函數。

事情會更復雜,唯一的缺點是,如果有人創建了一個應用程序並傳遞了相同的連接字符串。

有什麼想法?

回答

0

在我看來,這是數據庫系統的安全管理工作:

  1. 爲應用程序創建一個數據庫用戶(不使用SA!)。
  2. 授予該用戶執行CLR函數
  3. 「Ungrant」所有其他用戶執行這些功能
+0

我曾考慮過這個解決方案,但我們的客戶不希望這個解決方案。 –

0

您還可以使用APP_NAME()來檢查,如果該請求是從你的應用程序的權利

+0

這就是我想到的,但違約是,如果有人創建了一個應用程序並傳遞了相同的連接字符串。 –

0

MSDN EncryptionByKey。並確定您的需要盛大/撤銷權證書/加密鑰匙

USE YourDB 
GO 
IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101) 
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'xxxYOURxSECURExPASSWORDxxx' 
GO 

ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY 
GO 

CREATE CERTIFICATE EncryptionCert 
    WITH SUBJECT = 'EncryptionCert',EXPIRY_DATE = '12/31/2014'; 
GO 

CREATE SYMMETRIC KEY EncryptionKey 
    WITH ALGORITHM = AES_256 ENCRYPTION BY CERTIFICATE EncryptionCert; 
GO 
-------- Example ---- 
DECLARE @EncryptionKeyGUID uniqueidentifier 
DECLARE @EncryptedValue varbinary(256) 
DECLARE @DecryptedValue nvarchar(100) = N'Test'; 

OPEN SYMMETRIC KEY EncryptionKey DECRYPTION BY CERTIFICATE EncryptionCert 

SET @EncryptionKeyGUID = Key_GUID('EncryptionKey'); 
SET @EncryptedValue = EncryptByKey(@EncryptionKeyGUID, @DecryptedValue); 

SELECT CAST(DecryptByKey(@EncryptedValue) as nvarchar(100)) 
GO