Sql 服务器非对称密钥解密到 Nvarchar 问题
Sql server asymmetric key decryption to Nvarchar issue
我在sql中遇到数据加密和解密问题,下面是我尝试过的场景。
•创建了 table(@TABLE),列类型为 NVARCHAR(MAX)。(尝试加密 FirstName、LastName、MiddleName、Country、TIN)
•创建存储过程以执行加密
◦存储过程接受 NVARCHAR(MAX) 类型的输入参数,加密值,将值转换为 NVARCHAR(MAX) 类型和 returns 值。
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 之上创建视图,视图解密并returns table.
中的所有值
CONVERT(VARCHAR(MAX), DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('AsymKeyPwd'), N'18SomeHiddenPassword!96', PRIMARYTIN))
问题与解密有关,一些值已正确解密,但我看到的是空值。
Joe - 楚簴䝌誉ꢁ裴柽 - Joe
Antony - 蠀簴二誉ꢁ裴柽 - Antony
123121312-砀簴䝌誉ꢁ罂粟- NULL
IN-蠀簴二誉ꢁ蔷薇-IN
US-蠀簴二誉ꢁ罂粟-NULL
如果 table 列的类型为 varbinary,则整个过程工作正常,但使用 nvarchar(max) 时,很少有值未按预期解密。我无法追踪问题。谁能帮我解决这个问题。
谢谢,
克里斯
解密部分语法错误
CONVERT(VARCHAR(MAX), DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('AsymKeyPwd'), N'18SomeHiddenPassword!96', PRIMARYTIN))
VARCHAR(MAX) 应该是 NVARCHAR(MAX),因为在所有其他地方它是 NVARCHAR( MAX) 类型.
我在sql中遇到数据加密和解密问题,下面是我尝试过的场景。
•创建了 table(@TABLE),列类型为 NVARCHAR(MAX)。(尝试加密 FirstName、LastName、MiddleName、Country、TIN)
•创建存储过程以执行加密 ◦存储过程接受 NVARCHAR(MAX) 类型的输入参数,加密值,将值转换为 NVARCHAR(MAX) 类型和 returns 值。
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 之上创建视图,视图解密并returns table.
中的所有值CONVERT(VARCHAR(MAX), DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('AsymKeyPwd'), N'18SomeHiddenPassword!96', PRIMARYTIN))
问题与解密有关,一些值已正确解密,但我看到的是空值。
Joe - 楚簴䝌誉ꢁ裴柽 - Joe
Antony - 蠀簴二誉ꢁ裴柽 - Antony
123121312-砀簴䝌誉ꢁ罂粟- NULL
IN-蠀簴二誉ꢁ蔷薇-IN
US-蠀簴二誉ꢁ罂粟-NULL
如果 table 列的类型为 varbinary,则整个过程工作正常,但使用 nvarchar(max) 时,很少有值未按预期解密。我无法追踪问题。谁能帮我解决这个问题。
谢谢, 克里斯
解密部分语法错误
CONVERT(VARCHAR(MAX), DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('AsymKeyPwd'), N'18SomeHiddenPassword!96', PRIMARYTIN))
VARCHAR(MAX) 应该是 NVARCHAR(MAX),因为在所有其他地方它是 NVARCHAR( MAX) 类型.