Как использовать DECRYPTBYPASSPHRASE с Int Column - PullRequest
0 голосов
/ 13 июня 2011

Я пытаюсь использовать 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 и т. Д.

Я подозреваю, что мои типы данных для моих процедур преобразования неверны, но я не могу понять, как это исправить.

Ответы [ 2 ]

1 голос
/ 13 июня 2011

Я не знаком с этими функциями, но использование varbinary вместо varchar должно исправить это из примеров MSDN.Типы возвращаемых значений: varbinary.

Шестнадцатеричный код для нуля ASCII равен 30 = 48 в десятичном виде.Итак, ваш закодированный 0x31 на самом деле равен 1, но вы читаете его обратно как 49.

Итак, правильно: десятичное значение 1 будет тогда varbinary 0x01
В настоящее время неверно, у вас есть десятичное число 1 -> varchar '1'-> подразумеваемое varbinary 0x31

0 голосов
/ 28 августа 2013
Convert(int,CONVERT(varchar(max), DECRYPTBYPASSPHRASE(@PassphraseEnteredByUser, ENextIndex))) as DENextIndex

Используйте Varchar (max) для расшифровки. затем конвертировать в int это будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...