【问题标题】:How to use DECRYPTBYPASSPHRASE with an Int Column如何将 DECRYPTBYPASSPHRASE 与 Int 列一起使用
【发布时间】:2013-08-28 17:58:47
【问题描述】:

我正在尝试使用 EncryptByPassPhrase 和 DecryptByPassPhrase 将 int 值持久保存在 SQL 数据库中。

我有 2 个原始列(仅用于测试,一旦此代码运行,我将删除它们),Base (varchar) 和 NextIndex (int)。我将它们的值加密为 2 个 varbinary 列,如下所示:

DECLARE @PassphraseEnteredByUser nvarchar(128);
SET @PassphraseEnteredByUser = 'some password';

UPDATE [dbo].[Licenses]
SET EBase = EncryptByPassPhrase(@PassphraseEnteredByUser, Base),
    ENextIndex = EncryptByPassPhrase(@PassphraseEnteredByUser, CONVERT(varchar(10), NextIndex);
GO

然后我尝试使用 DECRYPTBYPASSPHRASE 存储过程检索值:

DECLARE @PassphraseEnteredByUser nvarchar(128);
SET @PassphraseEnteredByUser = 'some password';

SELECT TOP 1000 [Id]
      ,[Base]
      ,[NextIndex]
      ,CONVERT(varchar, DECRYPTBYPASSPHRASE(@PassphraseEnteredByUser, EBase)) as DEBase
      ,CONVERT(int, DECRYPTBYPASSPHRASE(@PassphraseEnteredByUser, ENextIndex)) as DENextIndex
  FROM [dbo].[Licenses]

字符串列(Base)已正确解密,但整数列未正确解密:原始值 1 解密为 49,值 2 解密为 50,等等。

我怀疑我的转换例程的数据类型不正确,但我不知道如何修复它。

【问题讨论】:

    标签: sql encryption


    【解决方案1】:

    我不熟悉这些函数,但使用 varbinary 而不是 varchar 应该可以从 MSDN 示例中修复它。返回类型是 varbinary。

    ASCII 零的十六进制代码是 30 = 十进制的 48。因此,您编码的 0x31 实际上是 1,但您将其读回为 49。

    所以,正确:十进制 1 将是 varbinary 0x01
    目前,错误,你有十进制 1 -> varchar '1' -> 隐含的 varbinary 0x31

    【讨论】:

    • 确实,将 NextIndex 的 CONVERT() 调用更改为目标 varbinary 而不是 varchar(10) 可以使这个加密/解密工作!奇怪的是,varchar 列不需要这种到 varbinary 的转换,而且将 int 转换为 varchar 也不起作用。
    【解决方案2】:
    Convert(int,CONVERT(varchar(max), DECRYPTBYPASSPHRASE(@PassphraseEnteredByUser, ENextIndex))) as DENextIndex
    

    也使用 Varchar(max) 进行解密。 然后转换为 int 这将起作用。

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2011-02-22
      • 1970-01-01
      • 2020-04-17
      • 2014-10-18
      • 2023-03-26
      相关资源
      最近更新 更多