SQL EncryptByKey / DecryptByKey将保存为英语的数据转换为非英语字符

时间:2015-01-08 16:53:36

标签: encryption sql-server-2008-r2

我正在尝试使用加密来混淆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加密算法。

2 个答案:

答案 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

对于你而言,同样的事情是你无需猜测转换语句需要多少个字符......而且你不必嵌入转换语句。