Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sqlserver中的加密存储过程_Sql_Sql Server - Fatal编程技术网

sqlserver中的加密存储过程

sqlserver中的加密存储过程,sql,sql-server,Sql,Sql Server,我尝试在SQLServer中创建一个简单的存储过程,用密钥加密数据 我已经在数据库中创建了一个主密钥(UserMasterKey)&一个证书(UserMasterCert)。因为这是一个一次性任务,所以存储过程中没有包含该任务 CREATE PROCEDURE [dbo].[AES_ENCRYPT] @data VARBINARY, @password NVARCHAR(10) AS OPEN SYMMETRIC KEY UserMasterKey DECRYPT

我尝试在SQLServer中创建一个简单的存储过程,用密钥加密数据

我已经在数据库中创建了一个主密钥
(UserMasterKey)
&一个证书
(UserMasterCert)
。因为这是一个一次性任务,所以存储过程中没有包含该任务

CREATE PROCEDURE [dbo].[AES_ENCRYPT]
    @data VARBINARY,
    @password NVARCHAR(10)
AS
    OPEN SYMMETRIC KEY UserMasterKey
    DECRYPTION BY CERTIFICATE UserMasterCert WITH PASSWORD = @password;
    DECLARE @encrypted NVARCHAR(50) = ENCRYPTBYKEY(KEY_GUID(N'UserMasterKey'), @data);
    CLOSE SYMMETRIC KEY UserMasterKey;
RETURN @encrypted
但我得到以下错误:

@password附近的语法不正确


这个过程有两个错误,我从来没有使用证书来加密对称密钥,就我所记得的,我们使用了一个非对称密钥来加密对称密钥

不管怎样,回到你的程序上来

  • 您没有提到
    @Data
    变量的任何长度,这意味着默认情况下,它的指定长度为1。这是sql server的默认行为
  • 您正试图使用return关键字从此过程返回字符串。Sql Server只能使用return关键字返回INT数据类型。要返回任何其他数据类型,必须使用输出参数
  • 您正试图将加密数据存储到NVARCHAR变量。当加密数据为varbinary数据类型时,此数据
  • 您的输入数据将是一些字符串varchar/Nvarchar,输出的加密数据将是varbinary
  • 我建议的修复方案

    CREATE PROCEDURE [dbo].[AES_ENCRYPT]
        @data       NVARCHAR(50),
        @password   NVARCHAR(10),
        @encrypted  VARBINARY(4000) OUTPUT
    AS
     BEGIN
        SET NOCOUNT ON;
    
        OPEN SYMMETRIC KEY UserMasterKey
        DECRYPTION BY CERTIFICATE UserMasterCert WITH PASSWORD = @password;
    
        SET @encrypted = ENCRYPTBYKEY(KEY_GUID(N'UserMasterKey'), @data);
    
        CLOSE SYMMETRIC KEY UserMasterKey;
     END
    

    之所以出现此错误,是因为使用VARBINARY参数时,您需要指定一个长度,即VARBINARY(1000)或VARBINARY(MAX)。

    除了@M.Ali在其中指出的所有问题之外,还有当前的问题(即“靠近@password的语法不正确”错误)很可能是
    WITH PASSWORD=
    子句需要一个文本字符串,并且不会像您尝试使用
    @PASSWORD
    那样接受变量

    如果查看MSDN页面,您将看到以下语法(编辑为仅显示相关部分):


    感谢您提供全面的信息,但我仍然遇到相同的错误:“@password”附近的语法不正确。sqlfiddle我尝试将VARBINARY(MAX)放在这里。它没有修复错误:没有指定长度不是语法问题。SQL Server将只使用默认长度,在本例中为1。
     OPEN SYMMETRIC KEY Key_name DECRYPTION BY <decryption_mechanism>
    
     <decryption_mechanism> ::=
         CERTIFICATE certificate_name [ WITH PASSWORD = 'password' ]
    
    CREATE PROCEDURE [dbo].[AES_ENCRYPT]
    (
        @data       VARBINARY(8000),
        @password   NVARCHAR(10),
        @encrypted  VARBINARY(8000) OUTPUT
    )
    AS
    BEGIN
        SET NOCOUNT ON;
    
        DECLARE @SQL NVARCHAR(MAX);
    
        SET @SQL = N'
        OPEN SYMMETRIC KEY UserMasterKey
        DECRYPTION BY CERTIFICATE UserMasterCert WITH PASSWORD = '''
          + @password
          + N''';
    
        SET @TempEncrypted = ENCRYPTBYKEY(KEY_GUID(N''UserMasterKey''), @TempData);
    
        CLOSE SYMMETRIC KEY UserMasterKey;
        ';
    
        EXEC dbo.sp_executesql
                @SQL,
                N'@TempData VARBINARY(8000), @TempEncrypted VARBINARY(8000) OUTPUT',
                @TempData = @data,
                @TempEncrypted = @encrypted OUTPUT;
    
    END