encryption - SQL EncryptByKey/DecryptByKey 把英文保存的数据变成非英文字符

标签 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 加密算法。

最佳答案

事实证明,这是另一个实物教训,说明为什么让计算机猜测你在想什么是个坏主意。

当我插入新行时

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。

关于encryption - SQL EncryptByKey/DecryptByKey 把英文保存的数据变成非英文字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27845421/

相关文章:

c# - 用于处理个人和经常性费用的数据库设计

当解密显示特殊字符时 SQL Server 2008 R2 加密问题

node.js - decipher.update 上出现加密错误

encryption - MMORPG协议(protocol)加密

SQL 反向 LIKE

c# - 存储过程不执行 ASP.NET C#

sql-server - 在同一 .bat 文件中安装 SQL 和 sqlcmd 时出现问题

java - 将字节转换为文件输入流

encryption - Bouncy CaSTLe 的加密级别是多少

amazon-web-services - 如何保护传输中的 AWS S3 上传/下载数据?