【问题标题】:SQL Server encryption : create key inside stored procedureSQL Server 加密:在存储过程中创建密钥
【发布时间】:2015-12-07 10:34:57
【问题描述】:

我需要创建一个存储过程,允许我们的密码管理员在我们的DR 数据库中重新创建对称密钥,但不知何故它总是抱怨语法不正确。这在 SQL Server 2008 R2 中是否允许,或者只是语法不正确?谢谢

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_BCPRecreateEncryption] 
    @Password varchar(255)
AS
BEGIN
    DROP SYMMETRIC KEY SymmetricKeyName
    DROP CERTIFICATE EncryptCert
    DROP MASTER KEY

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = @Password

    CREATE CERTIFICATE EncryptCert
        WITH SUBJECT = N'EncryptCert', START_DATE = N'08/06/2014 07:16:08', EXPIRY_DATE = N'08/06/2042 07:16:08'
        ACTIVE FOR BEGIN_DIALOG = ON;

    CREATE SYMMETRIC KEY SymmetricKeyName
        WITH KEY_SOURCE = @Password, 
                IDENTITY_VALUE = @Password, 
             ALGORITHM = AES_256
        ENCRYPTION BY CERTIFICATE EncryptCert;
END

我也尝试使用executesql,但仍然遇到同样的错误

DECLARE @ParmDefinition nvarchar(500);
SET @ParmDefinition = N'@Password string' ;

EXECUTE sp_executesql N'CREATE MASTER KEY ENCRYPTION BY PASSWORD = @DCMPassword', @ParmDefinition , @DCMPassword=@Password

编辑添加错误:

消息 102,级别 15,状态 1,过程 sp_BCPRecreateEncryption,第 13 行
“@Password”附近的语法不正确。

消息 102,级别 15,状态 1,过程 sp_BCPRecreateEncryption,第 20 行
“@Password”附近的语法不正确。

【问题讨论】:

  • 请发布确切的错误
  • string 不是有效的 SQL 数据类型 ;-)
  • 似乎不支持此参数。您可以尝试创建整个文字字符串并使用 EXEC 执行该字符串,但您需要注意密码中的任何 ' 字符

标签: sql-server stored-procedures encryption sql-server-2008-r2


【解决方案1】:

您可以尝试使用占位符创建变量@sql,然后使用REPLACE 填充它们。

这种方法比字符串连接稍微好一些,因为双数和四数更少 - ':

DECLARE @sql NVARCHAR(MAX) = 
    N'CREATE MASTER KEY ENCRYPTION BY PASSWORD = ''@DCMPassword''';

SELECT @sql = REPLACE(@sql, '@DCMPassword', @Password);

EXEC(@sql);

【讨论】:

    【解决方案2】:

    主要问题是不能使用变量来设置密码;它们必须是字符串文字。如果您只查看 CREATE MASTER KEY 的 MSDN 页面,您会注意到没有为 password 传递局部变量的选项。 CREATE SYMMETRIC KEY 的文档还显示,只有字符串文字对 KEY_SOURCEIDENTITY_VALUE 有效。

    您尝试通过动态 SQL 修复的第二个问题是 string 不是有效的数据类型。

    如果要从存储过程输入参数中获取值,则需要将该值连接到动态 SQL 中。请务必先清理单引号 ;-) 以避免 SQL 注入问题。

    SET @Password = REPLACE(@Password, N'''', N'''''');
    
    DECLARE @SQL NVARCHAR(MAX) = N'
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = '''
      + @Password
      + N''';';
    
    EXEC(@SQL);
    

    【讨论】:

      猜你喜欢
      • 2017-08-08
      • 2017-05-28
      • 2010-09-08
      • 2015-07-16
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      相关资源
      最近更新 更多