2011-06-13 80 views
0

我正嘗試使用EncryptByPassPhrase和DecryptByPassPhrase在SQL數據庫中保留int值。如何將DECRYPTBYPASSPHRASE與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] 

的字符串列(庫)是正確解密,但整數列不是:原始值1被解密爲49,因爲值2解密爲50等。

我懷疑我的數據類型爲我的轉換例程是不正確的,但我無法弄清楚如何修理它。

回答

1

我不熟悉這些函數,但使用varbinary而不是varchar應該從MSDN示例中修復它。返回類型是varbinary。

十六進制ASCII零的十六進制代碼是30 = 48。所以,你的編碼0X31實際上是1,但你所以,正確地閱讀它早在49

:那麼小數1將VARBINARY 0×01
目前,錯了,你有小數1 - > VARCHAR「1」 - >隱含varbinary 0x31

+0

事實上,將NextIndex的CONVERT()調用更改爲目標varbinary而不是varchar(10),使得此加密/解密工作正常!奇怪的是,varchar列轉換爲varbinary並不需要,並且將int轉換爲varchar也不起作用。 – 2011-06-13 09:31:39

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

使用Varchar(max)進行解密。 然後轉換爲int這將工作。

相關問題