Как использовать целочисленное значение в запросе SQL Server с использованием HashBytes - PullRequest
2 голосов
/ 05 июля 2011

Я пытаюсь сделать запрос к таблице имени пользователя, где совпадают имя пользователя и пароль.Эта таблица является уже существующей (созданной во время установки программного обеспечения компании), и у меня нет возможности изменять типы или методы шифрования.Запрос со строкой в ​​качестве пароля работает отлично, но когда я пытаюсь выполнить запрос с использованием целого числа, запрос возвращает значение NULL.

"SELECT *
 FROM ITF_USER
 WHERE ITF_LOGIN = '$lcUserName'
 AND ITF_PASS = HashBytes('SHA1', '$lcPassword')";

, если пароль похож на 'helloworld', тогда запрос работает нормально, но'1121321' ничего не возвращает.Любые предложения?

ОБНОВЛЕНИЕ Если я сравню сохраненный в таблице пароль с результатами php sha1 ($ lcPassword), я вижу небольшую разницу, которая вызывает результаты нулевого запроса:

table -> 0x3FEEAC0B3A75CF1C12A8420CDE593FA275CCE584
sha1()->   8feeac0b3a75cf1c12a8420cde598fa275cce584

в sha1 () есть две 8, которые должны быть 3

1 Ответ

1 голос
/ 01 августа 2011

Я пробовал это:

declare @vc varchar(255), @nvc nvarchar(255)
set @vc = '1111'
set @nvc = '1111'
select hashbytes('sha1', @vc)
select hashbytes('sha1', @nvc)

Возвращены разные значения:

varchar  = 0x011C945F30CE2CBAFC452F39840F025693339C42
nvarchar = 0x40C7BD210D05DBEA19402B952DD416E487450955

Кажется, что тип данных вторых параметров имеет значение при вызове HashBytes(). Возможно, при использовании строки передается varchar, а int преобразуется в nvarchar (или наоборот).

Это может сработать, чтобы заставить все к одному типу: HashBytes('SHA1', cast('$lcPassword' as varchar(255))

...