密码参数不为空时,DecryptByKeyAutoAsymKey出现问题

时间:2014-01-28 15:58:16

标签: sql sql-server sql-server-2008 encryption

我正在尝试在测试数据库上设置一些加密。目前,我正在创建一个非对称密钥,它使用用户提供的密码来加密私钥。然后我用它来加密我创建的对称密钥。

CREATE ASYMMETRIC KEY myAsymmetricKey
WITH ALOGRITHM = RSA_2048
ENCRYPTION BY PASSWORD = 'mySecurePassword'
GO

CREATE SYMMETRIC KEY mySymmetricKey 
WITH ALOGRITHM = AES_256
ENCRYPTION BY ASYMMETRIC KEY myAsymmetricKey
GO

我能够成功加密目标数据库表中的所需列

OPEN SYMMETRIC KEY mySymmetricKey
DECRYPTION BY ASYMMETRIC KEY myAsymmetricKey WITH PASSWORD = 'mySecurePassword'

UPDATE myTable
SET EmailAddressEncrypted = ENCRYPTBYKEY(KEY_GUID('mySymmetricKey'), EmailAddress)

CLOSE SYMMETRIC KEY mySymmetricKey

我的问题涉及数据的解密。理想情况下,我希望能够在调用者传入密码的情况下在存储过程中执行此操作。

CREATE PROCEDURE Foo
    @id int,
    @password varchar(30)
AS
BEGIN
    SELECT TargetID,
           EmailAddress
           CAST(DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('myAsymmetricKey'), @password, emailAddressEncrypted) AS VARCHAR(125)) 
    FROM myTable
    WHERE TargetID = @id      
END

不幸的是,当我尝试创建此过程时,我收到以下错误:

  

参数数据类型varchar对DecryptByKeyAutoAsymKey函数的参数2无效。

我对此感到困惑,因为当我查看DecrypByKeyAutoAsymKey的MSDN page时,它说参数2“akey_password”是:

  

是否保护非对称密钥的私钥的密码。如果私钥受数据库主密钥保护,则可以为NULL。 akey_password是varchar。

他们在页面上的示例仅使用NULL作为此参数的值,这在此处不起作用,因为我不相信我正在使用DMK加密私钥。关于我在这里做错了什么的帮助/建议或者更好的方法来实现这一点将不胜感激。感谢。

注意:这是在SQL Server 2008上

2 个答案:

答案 0 :(得分:0)

似乎MSDN页面上的文档不正确。 " akey_password"的数据类型是 nvarchar ,而不是 varchar 。使用 nvarchar 类型的参数可用于解密。

我希望这可以帮助遇到同样问题的其他人。

答案 1 :(得分:0)

是。使用nVarchar是个好主意。并尝试使用Convert而不是Cast。 演员不适合我。