我正在尝试在测试数据库上设置一些加密。目前,我正在创建一个非对称密钥,它使用用户提供的密码来加密私钥。然后我用它来加密我创建的对称密钥。
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上
答案 0 :(得分:0)
似乎MSDN页面上的文档不正确。 " akey_password"的数据类型是 nvarchar ,而不是 varchar 。使用 nvarchar 类型的参数可用于解密。
我希望这可以帮助遇到同样问题的其他人。
答案 1 :(得分:0)
是。使用nVarchar是个好主意。并尝试使用Convert而不是Cast。 演员不适合我。