【问题标题】:Issue with DecryptByKeyAutoAsymKey when Password Parameter is not Null当密码参数不为 Null 时,DecryptByKeyAutoAsymKey 出现问题
【发布时间】:2014-02-20 01:03:12
【问题描述】:

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

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 上

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      是的。使用 nVarchar 是个好主意。并且还尝试使用 Convert 而不是 Cast。 Cast 对我不起作用。

      【讨论】:

        猜你喜欢
        • 2021-11-19
        • 1970-01-01
        • 2021-02-09
        • 2021-10-22
        • 2019-06-27
        • 1970-01-01
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        相关资源
        最近更新 更多