2014-03-07 46 views
5

我用下面的代碼創建了SQL2012的對稱密鑰使用對稱密鑰相應的權限(身份登錄的Windows管理員用戶):格蘭特在存儲過程

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '34trg45trgf546t'; 
CREATE CERTIFICATE SSCert01 WITH SUBJECT = 'SS Certificate 01'; 
CREATE SYMMETRIC KEY SSN_Key_01 WITH ALGORITHM = TRIPLE_DES ENCRYPTION BY CERTIFICATE SSCert01; 

一旦做我申請加密某些數據庫列。仍然以管理員身份登錄,我可以使用密鑰成功解密列:

OPEN SYMMETRIC KEY SSN_Key_01 DECRYPTION BY CERTIFICATE SSCert01; 
SELECT 
    name, 
    surname, 
    CONVERT(nvarchar(50),DECRYPTBYKEY(PasswordEnc)) as DecryptedPassword 
FROM 
    [tbl_Users]; 
CLOSE SYMMETRIC KEY SSN_Key_01; 

然後,我將上述代碼放入存儲過程。問題是我的應用程序使用兩個角色訪問SQL,這些角色訪問相應的proc。當這兩種角色的嘗試執行包含上述代碼PROC,我看到此錯誤:

Cannot find the certificate 'SSCert01', because it does not exist or you do not have permission. The key 'SSN_Key_01' is not open. Please open the key before using it.

當我登錄爲任一角色,它們不能看到鍵或證書。那麼,任何人都可以建議WHICH授予角色的權限,以便他們可以使用存儲過程中的密鑰/證書(僅)來加密/解密數據。除了加密/解密之外,角色不應該被允許使用密鑰/證書執行任何功能。我曾看過MSDN/Google,但我都不明白。

UPDATE 下面的代碼允許角色使用PROC的,但我很擔心,CONTROL是太大出入。任何人都可以提供一些清晰度?

GRANT CONTROL ON CERTIFICATE :: SSCert01 TO Role001; 
GRANT CONTROL ON SYMMETRIC KEY :: SSN_Key_01 TO Role001; 

回答

7

的方式,我通常在此得到的是設定的程序來執行作爲所有者,然後確保該過程的所有者具有正確的權限進行解密,很多時間的主人PROC是DBO反正因此不需要額外的配置需要從改變像這樣的程序除了完成:

ALTER PROCEDURE proc_name 
WITH EXECUTE AS OWNER 
AS 
OPEN SYMMETRIC KEY SSN_Key_01 DECRYPTION BY CERTIFICATE SSCert01; 
SELECT 
    name, 
    surname, 
    CONVERT(nvarchar(50),DECRYPTBYKEY(PasswordEnc)) as DecryptedPassword 
FROM 
    [tbl_Users]; 
CLOSE SYMMETRIC KEY SSN_Key_01; 

這意味着你不必授予在所有任何額外的權限給應用程序的角色或用戶。

+0

謝謝,我不知道'EXECUTE AS'。不知道這是更多的解決方法,但...? – EvilDr

+2

@EvilDr,好吧,你就是這麼做的。似乎沒有更好的方法。您需要對證書進行CONTROL權限才能解密密鑰。如果您不想按照此答案 –

+0

中所述使用存儲過程來授予角色,那麼很好。 'GRANT CONTROL'是否允許角色/用戶使用DROP或ALTER證書/密鑰? – EvilDr