(遵循在本·卡尔的博客中找到的打开密钥、加密和关闭密钥的方法。)
假设您有一个MS服务器,它有大量密钥用于加密不同表中的不同字段,这些字段是您经常更新的,您使用过程打开密钥并关闭密钥,但是为了减少您必须经常更新的过程和函数的数量,您取消了加密数据的函数,而是使用OUTPUT密钥和证书名称,这样您就可以使用常规的加密函数和来自OpenKey过程输出参数的密钥和证书。
看起来会是这样的:
CREATE PROC [dbo].[sproc_OpenKey_10]
(
@Key CHAR(10) OUTPUT
,@Cert CHAR(10) OUTPUT
)
AS
BEGIN
IF CONVERT(DATE,GETDATE()) < '1/1/2017'
BEGIN
OPEN SYMMETRIC KEY AC_16
DECRYPTION BY CERTIFICATE WebAC16
Set @Key = 'AC_16'
Set @Cert = 'WebAC16'
END
ELSE
BEGIN
OPEN SYMMETRIC KEY AC_17
DECRYPTION BY CERTIFICATE WebAC17
Set @Key = 'AC_17'
Set @Cert = 'WebAC17'
END
RETURN
END因此,使用这个函数和加密如下:
DECLARE @Key10 CHAR(10)
DECLARE @Cert10 CHAR(10)
DECLARE @EncID VARCHAR(100)
EXEC dbo.sproc_Secure_OpenKey_10 @Key = @Key10 OUTPUT, @Cert = @Cert10 OUTPUT
SET @EncID = EncryptByKey(Key_GUID(@Key10), @Custid)(注:证书将存储在表中,以便稍后解密--这就是返回证书的原因。)
从理论上讲,这很方便,您只需更新OpenKey和CloseKey过程即可。
从OpenKey存储过程中输出密钥和证书名称是可能的安全漏洞吗?如果是的话,有什么办法可以保证这个安全?
如有任何意见,我将不胜感激。
谢谢!
发布于 2016-11-09 18:42:37
经过一段时间的研究,我想我已经回答了我自己的问题。
当使用这种打开和关闭键的方法时,您不会设置任何权限,因此,任何没有相应权限的东西都不能使用存储过程并接收输出的密钥和证书名称-- OpenKey和CloseKey存储过程在调用存储过程的权限下工作,因此只有具有权限的调用存储过程才能使用和查看OpenKey过程输出的密钥和证书名称。
总之:似乎输出OpenKey存储过程中的密钥和证书名称不应该创建安全漏洞,前提是没有为其设置权限。
我想我应该分享我的发现,如果它能帮助别人的话。
https://security.stackexchange.com/questions/138864
复制相似问题