我使用以下代码在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;
答案 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;
这意味着您不必向应用程序角色或用户授予任何其他权限。