Пароль не совпадает с алгоритмом хеширования (SQL Server) - PullRequest
0 голосов
/ 05 февраля 2011

У меня проблема с SQL Server. Моя задача - реализовать простую пользовательскую систему на базе SQL Server с PHP. Базы данных также используются MMORPG, поэтому я не имею права изменять структуру базы данных или хэшировать аллогритмы. Настоящая причина моей проблемы в том, что пароль хешируется следующим логом

HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW)

Я создал тестового пользователя с именем test123 и pw hallo123, который соответствует хэшу пароля "0x7CEE495091E11FF9560D3D016513332200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 * 1004

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

mssql_query("SELECT * FROM [DB_Member].[dbo].[Member] WHERE ID = 'test123' AND PW = HashBytes('MD5', REVERSE(UPPER('test123')) + 'hallo123')");

Что не возвращает результата. Но если я напрямую запущу этот запрос

mssql_query("SELECT * FROM [DB_Member].[dbo].[Member] WHERE ID = 'test123' AND PW = 0x7CEE495091E11FF9560D3D01651333220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);

Я получаю данные без проблем

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

Ответы [ 3 ]

1 голос
/ 06 февраля 2011

Я думаю, вам нужно поближе взглянуть на ваши типы данных. Я предполагаю, что переменные @ID и @PW - это тип данных char, в котором генерируется хеш. Когда вы пытаетесь выполнить запрос, вставляя 'test123' и 'hallo123', вам нужно добавить пробелы после, чтобы они соответствовали типу данных char (?), Который был в подпрограмме, создавшей хеш.

Вот пример, иллюстрирующий разницу в использовании типов данных char и varchar.

Использование символа

declare @PW char(25)
declare @ID char(25)

set @PW = 'hallo123'
set @ID = 'test123'

select (HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW))

Результат хеширования

0x9F1E0132F198216841E2608901D27115

Использование varchar

declare @PW varchar(25)
declare @ID varchar(25)

set @PW = 'hallo123'
set @ID = 'test123'

select (HashBytes('MD5', REVERSE(UPPER(@ID)) + @PW))

Результат хеширования

0x870B01D196916AFA88EBC900BE5395BE

Хеши явно не совпадают.

Причина, по которой после хеша у вас куча нулей, заключается в том, что хеш хранится в двоичном (60) поле. HashBytes возвращает VarBinary, но это не является причиной сбоя запроса. SQL Server выполняет какое-то преобразование при сравнении двоичного файла с VarBinary.

0 голосов
/ 05 февраля 2011

Когда я запускаю SELECT HashBytes('MD5', REVERSE(UPPER('test123')) + 'hallo123'), я получаю результат 0x870B01D196916AFA88EBC900BE5395BE.Вы уверены, что вы правильно создали хеш, и что вы использовали правильный идентификатор и пароль при создании тестового пользователя?

0 голосов
/ 05 февраля 2011

Возможно ли, что любой язык, который вы используете, странным образом кодирует его? Что если вы откроете профилировщик SQL и посмотрите на отправляемый запрос, чтобы увидеть, можете ли вы определить различия?

...