MD5 хэши не совпадают - PullRequest
       6

MD5 хэши не совпадают

2 голосов
/ 10 июня 2011

Я пытаюсь сопоставить md5 (сгенерированный через php) с его исходным значением в базе данных SQLExpress.

Я использую следующую функцию в своем запросе SQL

master.sys.fn_varbintohexsubstring(0, HASHBYTES('MD5', 'ID'), 1, 0)

Где 'ID' - это поле в базе данных.

Однако оба они, похоже, возвращают разные значения для хэша md5.Я использовал '12290' в качестве статического значения для проверки этого.

php md5 () возвращает: 0bd81786a8ec6ae9b22cbb3cb4d88179

Следующий оператор SQL возвращает тот же вывод:

DECLARE @password VARCHAR(255)
SET @password = master.sys.fn_varbintohexsubstring(0, HASHBYTES('MD5', '12290'), 1, 0)
SELECT @password

Тем не менее, когда я запускаю следующий оператор из таблицы:

SELECT ID,  master.sys.fn_varbintohexsubstring(0, HASHBYTES('MD5', CONVERT(NVARCHAR(255), ID)), 1, 0) AS temp
FROM Clients
ORDER BY ID ASC

Возвращает значение 'temp', соответствующее значению 'ID' 12290: 1867dce5f1ee1ddb46ff0ccd1fc58e03

Любая помощь по этому вопросуБуду очень признателен!

Спасибо

Ответы [ 3 ]

3 голосов
/ 10 июня 2011

Python помог мне помочь вам.

>>> from hashlib import md5
>>> md5('1\x002\x002\x009\x000\x00').digest().encode('hex')
'1867dce5f1ee1ddb46ff0ccd1fc58e03'

NVARCHAR - это тип Unicode, и из приведенного выше эксперимента видно, что '12990' хранится в вашей базе данных как UTF-16LE: '1\02\09\09\00\0'.

Предполагая, что кодировка данных в PHP - это данные UTF-8, и вы не хотите изменять существующие данные в базе данных, вот как вы можете исправить свой PHP-скрипт:

<?php
    $password = '12290';
    $hash = md5(mb_convert_encoding($password, 'UTF-16LE', 'UTF-8')) . "\n";
    echo $hash;
?>

Выход:

susam@swift:~$ php utf16le-hash.php
1867dce5f1ee1ddb46ff0ccd1fc58e03

В случае, если данные в PHP находятся в какой-то другой кодировке, такой как ASCII, ISO-8859-1 и т. Д., Вы можете изменить третий аргумент на mb_convert_encoding соответственно. Список всех поддерживаемых кодировок доступен по адресу: http://www.php.net/manual/en/mbstring.supported-encodings.php

Также см. http://www.php.net/manual/en/function.mb-convert-encoding.php

0 голосов
/ 10 июня 2011

У меня нет SQL-сервера для проверки этого, но команда CONVERT может создавать NVARCHAR с 240 нечетными конечными пробелами (как вы указали NVARCHAR (255))

Попробуйте установить NVARCHAR на длину идентификатора для проверки:

ARE @password VARCHAR(255)
SET @password = master.sys.fn_varbintohexsubstring(0, HASHBYTES('MD5', CONVERT(NVARCHAR(5), '12290')), 1, 0)
SELECT @password

Попробуйте с разной длиной в CONVERT - есть ли разница?

0 голосов
/ 10 июня 2011

Скорее всего проблема в одной из двух вещей:

  1. Либо столбец идентификатора в этой строке имеет значение, не равное '12290' (например, дополнительный пробел)
  2. Или функция CONVERT выдает такое значение

В любом случае стандартным подходом к отладке будет использование SQL-запроса для выбора длины строки этого поля ID и возвращаемого значения CONVERT; если любой из них не равен 5, вы нашли ошибку.

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

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