【问题标题】:SQL EncryptByKey / DecryptByKey turns data saved in English into non-English charactersSQL EncryptByKey / DecryptByKey 把英文保存的数据变成非英文字符
【发布时间】:2015-03-06 21:07:35
【问题描述】:

我正在尝试使用加密来混淆我的 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”在“解密列”中以某种楔形文字、亚洲风格的脚本返回。这是什么原因造成的?我正在使用 SQL Server 2008 R2 和 AES_256 加密算法。

【问题讨论】:

    标签: encryption sql-server-2008-r2


    【解决方案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。

    【讨论】:

      【解决方案2】:

      您的帖子给了我解决这个问题的见解。你的方法确实有效,你也可以在字符串 'foobar' 的开头添加一个 'N',就像这样:

      INSERT INTO [myTable]
      VALUES (foo, 'bar', EncryptByKey(Key_GUID('EncryptionKey')
             ,CONVERT(nvarchar(50), N'fooBar')));
      GO
      

      为您做同样的事情,而无需猜测您的转换语句需要多少个字符...而且您不必嵌入转换语句。

      【讨论】:

        猜你喜欢
        • 2015-10-27
        • 2016-10-08
        • 1970-01-01
        • 2020-09-26
        • 2019-04-05
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多