我在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)时,很少有值不会按预期解密。我无法追查问题。任何人都可以帮我解决这个问题。
谢谢, 克里斯
答案 0 :(得分:0)
您在解密部分
中有语法错误CONVERT( VARCHAR(MAX),DECRYPTBYKEYAUTOASYMKEY(ASYMKEY_ID('AsymKeyPwd'),N'18SomeHiddenPassword!96',PRIMARYTIN))
VARCHAR(MAX)应 NVARCHAR(MAX),与所有其他地方一样, NVARCHAR(MAX)类型。