我正在尝试使用加密来混淆SQL数据库中的列。我开始按照MSDN中显示的步骤进行操作并且工作正常,但不适合生产,因为它显示了我试图在未加密的列中保持安全的数据。
所以我想将EncryptByKey应用于SQL INSERT命令,如下所示:
INSERT INTO [myTable]
VALUES (foo, 'bar', EncryptByKey(Key_GUID('EncryptionKey'), 'fooBar'));
GO
当我在执行此命令后检查结果时,我在包含加密数据值'fooBar'的列中看到了预期的varbinary gobbledygook字符串(我的加密数据列以varbinary(128)格式设置。)但是,当我试着解密我的数据:
SELECT [encryptedColumn],
CONVERT(nvarchar, DecryptByKey(encryptedColumn))
AS 'Decrypted Column'
FROM [myTable];
GO
值'fooBar'在'Decrypted Column'中的一些楔形文字,亚洲文字中返回。是什么导致了这个?我使用的是SQL Server 2008 R2和AES_256加密算法。
答案 0 :(得分:1)
原来这是另一个对象课,为什么让计算机猜出你在想什么是一个坏主意。
当我用
插入新行时INSERT INTO [myTable]
VALUES (foo, 'bar', EncryptByKey(Key_GUID('EncryptionKey'), 'fooBar'));
GO
......我忽略了指定什么类型的数据' fooBar'是。 SQL填补了空白,因此在解密时会发生悲剧。
添加如下所示的CONVERT语句:
INSERT INTO [myTable]
VALUES (foo, 'bar', EncryptByKey(Key_GUID('EncryptionKey'), CONVERT(nvarchar(50), 'fooBar')));
GO
消除了这种猜测和' fooBar'正确解密。在这种情况下,' fooBar'实际上是一个nvarchar。
答案 1 :(得分:0)
您的帖子让我有了解决此问题的见解。你的方式确实有用,你也可以在字符串'foobar'的开头加一个'N',所以这样:
INSERT INTO [myTable]
VALUES (foo, 'bar', EncryptByKey(Key_GUID('EncryptionKey')
,CONVERT(nvarchar(50), N'fooBar')));
GO
对于你而言,同样的事情是你无需猜测转换语句需要多少个字符......而且你不必嵌入转换语句。