如何将DECRYPTBYPASSPHRASE与Int列一起使用

时间:2011-06-13 09:10:58

标签: sql encryption

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

我有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,等等。

我怀疑我的转换例程的数据类型不正确,但我无法弄清楚如何修复它。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

Convert(int,CONVERT(varchar(max), DECRYPTBYPASSPHRASE(@PassphraseEnteredByUser, ENextIndex))) as DENextIndex

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