sqlserver中的加密存储过程
我尝试在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
(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的默认行为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