Sql server非对称密钥解密到Nvarchar问题

时间:2015-03-20 14:36:13

标签: sql sql-server sql-server-2008-r2 cryptography encryption-asymmetric

我在sql中面临数据加密和解密的问题,下面是我尝试过的场景。

•创建表(@TABLE),列类型为NVARCHAR(MAX)。(尝试加密FirstName,LastName,MiddleName,Country,TIN)

•创建存储过程以执行加密     ◦存储过程接受NVARCHAR(MAX)类型的输入参数,加密值,将值转换为NVARCHAR(MAX)类型并返回值。

CREATE PROCEDURE DNB_ENCRYPT    
(   
    @Value NVARCHAR(MAX),
    @EncryptedValue NVARCHAR(MAX) OUTPUT    
)    
AS
BEGIN

    IF NOT EXISTS (SELECT * FROM sys.asymmetric_keys WHERE name = 'ASymKeyPwd')
        CREATE ASYMMETRIC KEY ASymKeyPwd WITH ALGORITHM = RSA_2048 ENCRYPTION BY PASSWORD = N'18SomeHiddenPassword!96';

    IF NOT EXISTS (SELECT * FROM sys.symmetric_keys WHERE name = 'SymKey')
        CREATE SYMMETRIC KEY SymKey WITH ALGORITHM = AES_256 ENCRYPTION BY ASYMMETRIC KEY AsymKeyPwd;

    OPEN SYMMETRIC KEY SymKey DECRYPTION BY ASYMMETRIC KEY AsymKeyPwd WITH PASSWORD = N'18SomeHiddenPassword!96'    

    --INSERT INTO TESTTABLE(FIRSTNAME)VALUES(ENCRYPTBYKEY(KEY_GUID('SymKey'), @Value))

    SET @EncryptedValue = CONVERT(NVARCHAR(MAX), EncryptByKey(Key_GUID('SymKey'), @Value))
    CLOSE SYMMETRIC KEY SymKey;
END

•在@TABLE顶部创建视图,查看解密并返回表格中的所有值。

CONVERT(VARCHAR(MAX), DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('AsymKeyPwd'), N'18SomeHiddenPassword!96',  PRIMARYTIN))

问题在于解密,一些值被正确解密,对于少数值,我看到空值。

乔 - 蠀簴ꢁꢁJoe Joe Joe - 乔

安东尼 - 蠀簴䝌誉ꢁ罫柽 - 安东尼

123121312-蠀簴ꢁꢁ柽柽 - NULL

IN-蠀簴䝌誉ꢁ罫柽-IN

US-蠀簴䝌誉ꢁ罫柽-NULL

如果表列的类型为varbinary,整个过程可以正常工作,但是使用nvarchar(max)时,很少有值不会按预期解密。我无法追查问题。任何人都可以帮我解决这个问题。

谢谢, 克里斯

1 个答案:

答案 0 :(得分:0)

您在解密部分

中有语法错误

CONVERT( VARCHAR(MAX),DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('AsymKeyPwd'),N'18SomeHiddenPassword!96',PRIMARYTIN))

VARCHAR(MAX) NVARCHAR(MAX),与所有其他地方一样, NVARCHAR(MAX)类型。