授予适当的权限以在存储过程中使用对称密钥

时间:2014-03-07 15:56:03

标签: sql-server tsql sql-server-2012

我使用以下代码在SQL2012中创建了一个对称密钥(以Windows Admin用户身份登录):

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时,我看到了这个错误:

  

无法找到证书'SSCert01',因为它   不存在或您没有权限。键'SSN_Key_01'是   没开。请在使用前打开钥匙。

当我以任一角色登录时,他们无法看到密钥或证书。因此,任何人都可以建议授予角色的WHICH权限,以便他们可以在存储过程(仅)中使用密钥/证书来加密/解密数据。除了加密/解密之外,不应允许角色使用密钥/证书执行任何功能。我看过MSDN / Google,并不是更聪明的人。

更新 以下代码允许角色使用proc,但我担心CONTROL访问权限太多。有人可以提供一些清晰度吗?

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

1 个答案:

答案 0 :(得分:9)

我通常解决此问题的方法是将过程设置为以所有者身份执行,然后确保过程的所有者具有执行解密的正确权限,很多时候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;

这意味着您不必向应用程序角色或用户授予任何其他权限。