我是 SQL Server 加密的新手,我需要加密数据库的某些列。我设法创建了主 key ,证书,对称 key 并加密了我的列,但是当我解密时,它显示了一些类似于中文的字符,有人遇到过类似的事情吗?
这是我的代码。
DROP SYMMETRIC KEY CL1AES256Key1;
GO
DROP CERTIFICATE CL1AES256Cert1
GO
DROP MASTER KEY
GO
USE MYDB
GO
IF NOT EXISTS
(SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
CREATE MASTER KEY ENCRYPTION BY
PASSWORD = '24RJFEGFJuifjei343'
GO
CREATE CERTIFICATE CL1AES256Cert1
WITH SUBJECT = 'Encrypting certificate',
EXPIRY_DATE = '12/31/2030';
GO
CREATE SYMMETRIC KEY CL1AES256Key1
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE CL1AES256Cert1;
GO
OPEN SYMMETRIC KEY CL1AES256Key1
DECRYPTION BY CERTIFICATE CL1AES256Cert1;
INSERT INTO TMP VALUES(ENCRYPTBYKEY(KEY_GUID('CL1AES256Key1'), 'Yummi'))
CLOSE SYMMETRIC KEY CL1AES256Key1;
OPEN SYMMETRIC KEY CL1AES256Key1
DECRYPTION BY CERTIFICATE CL1AES256Cert1;
SELECT CAST(DECRYPTBYKEY(ENC) as nvarchar) FROM dbo.TMP
CLOSE SYMMETRIC KEY CL1AES256Key1;
这是结果
留浭i
如果有人知道我在哪里犯了错误,那将对我有很大帮助。
问候,
法比亚诺
最佳答案
您将加密值转换为 nvarchar,但是当您使用 insert 语句时,您指定了一个常规 varchar。如果将结果转换为 varchar,它应该会按预期工作。
此外,如果您使用字符 N
为字符串添加前缀,例如 N'Yummi'
,它也应该可以工作,因为使用 N
会告诉 SQL Server 此字符串文字是 unicode。见 http://msdn.microsoft.com/en-us/library/ms179899.aspx
您可以在 SQL Server 中的字符串排序规则上找到一个非常大的兔子洞。
http://msdn.microsoft.com/en-us/library/ms143726.aspx
关于SQL Server 2008 R2 加密问题,解密时显示特殊字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25333348/