【问题标题】:How to pass decryption certificate password as parameter to stored procedure如何将解密证书密码作为参数传递给存储过程
【发布时间】:2020-06-05 09:09:28
【问题描述】:

使用 SQL Server 2012 v11.0.2100.60,我正在尝试创建一个存储过程,该过程打开一个对称密钥,并通过带密码的证书解密。

如果我将硬编码密码放在存储过程中,它可以正常工作,但我希望能够将证书密码作为参数传递给存储过程(这样明文 pw 就不会存在于任何地方服务器)。

这是我尝试过的。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[testSproc]
    @pw VARCHAR(50)
AS
BEGIN
    SET NOCOUNT ON;

    OPEN SYMMETRIC KEY key_name  
    DECRYPTION BY CERTIFICATE cert_name WITH PASSWORD = '''+@pw+''';

    SELECT ....

当我执行时,我得到以下信息:

消息 15466,级别 16,状态 9,过程 testSproc,第 9 行
解密时出错。

这是我执行时的样子:

DECLARE @return_value int

EXEC    @return_value = [dbo].[testSproc]
        @GL = N'98787notTheRealPW45668456318'
        -- I've tried both N'98787notTheRealPW45668456318' and just '98787notTheRealPW45668456318'

SELECT  'Return Value' = @return_value
GO

我是否错误地传递了参数?或者错误地设置存储过程中的变量?非常感谢任何帮助!

【问题讨论】:

    标签: sql-server encryption


    【解决方案1】:

    想通了。将 OPEN KEY 命令放入它自己的变量中并在那里传递 pw。然后执行。

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[testSproc]
        @pw NVARCHAR(max)
    AS
    BEGIN
        DECLARE @SQL AS NVARCHAR(MAX);
        SET NOCOUNT ON;
        SET @SQL = 'OPEN SYMMETRIC KEY key_name DECRYPTION BY CERTIFICATE cert_name WITH PASSWORD = '''+@pw+'''';
    
        EXEC (@SQL)
        SELECT ....
    

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多