2011-06-10 3 views
1

J'essaie de faire correspondre un md5 a (généré par php) à sa valeur d'origine dans une base de données SQLExpress.MD5 Hashes ne correspondant pas

J'utilise la fonction suivante dans ma requête SQL

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

Où « ID » est le champ dans la base de données.

Cependant, ils semblent tous les deux renvoyer des valeurs différentes pour le hachage md5. J'ai utilisé '12290' comme valeur statique pour tester ceci.

php md5() retourne: 0bd81786a8ec6ae9b22cbb3cb4d88179

L'instruction SQL suivante retourne la même sortie:

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

Pourtant, quand je lance la déclaration suivante de la table:

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

Le La valeur 'temp' correspondant à la valeur 'ID' de 12290 renvoie: 1867dce5f1ee1ddb46ff0ccd1fc58e03

Toute aide sur le sujet serait grandement appréciée!

Merci

+1

Je ne suis pas familier avec la fonction de conversion que vous utilisez, mais pourquoi ne pas juste faire une comparaison directe? C'est juste une chaîne, alors comparez-la à la valeur hachée que vous avez obtenue de php? – kinakuta

+3

avez-vous essayé avec 'VARCHAR()' à la place sur 'NVARCHAR()'? –

+1

En utilisant VARCHAR() à la place travaillé, merci! – baked

Répondre

0

Je n'ai pas serveur SQL pour tester ce, mais la commande CONVERT pourrait être de créer les NVARCHAR avec des blancs de suivi de 240 impairs (comme vous avez spécifié NVARCHAR (255))

Essayez de régler le NVARCHAR à la longueur de l'ID à tester:

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

Essayez avec différentes longueurs dans le CONVERT - y a-t-il une différence?

0

L'une des deux choses est très probablement le problème:

  1. Soit la colonne ID dans cette ligne a une valeur pas exactement égale à '12290' (par exemple, des espaces supplémentaires)
  2. Ou la CONVERT fonction produit une telle valeur

Dans tous les cas, une approche de débogage standard serait d'utiliser une requête SQL pour SELECT les longueurs de chaîne de ce champ ID et la valeur de retour de CONVERT; si l'une ou l'autre n'est pas égale à 5, vous avez trouvé l'erreur.

Vous pouvez également effectuer une sauvegarde de la table en question, y compris des données, et consulter l'instruction INSERT générée pour voir ce que la base de données indique comme valeur dans cette colonne.

3

Python m'a aidé à vous aider.

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

NVARCHAR est de type Unicode et il semble de l'expérience ci-dessus que '12990' est stockée au format UTF-16LE dans votre base de données: '1\02\09\09\00\0'.

Si l'on suppose que le codage de données dans le PHP est données UTF-8 et que vous ne souhaitez pas modifier les données existantes dans la base de données, voici comment vous pouvez corriger votre script PHP:

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

sortie :

[email protected]:~$ php utf16le-hash.php 
1867dce5f1ee1ddb46ff0ccd1fc58e03 

dans le cas où les données en PHP est un autre codage comme ASCII, ISO-8859-1, etc., vous pouvez modifier le troisième argument de mb_convert_encoding en conséquence. La liste de tous les encodages pris en charge est disponible à l'adresse: http://www.php.net/manual/en/mbstring.supported-encodings.php

Aussi, voir http://www.php.net/manual/en/function.mb-convert-encoding.php