2011-06-10 267 views
1

我想匹配一個md5 has(通過php生成)到其在SQLExpress數據庫中的原始值。MD5哈希不匹配

我用我的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 

的與「ID」值12290匹配的'temp'值返回:1867dce5f1ee1ddb46ff0ccd1fc58e03

任何有關此事的幫助將不勝感激!

感謝

+1

我不熟悉您正在使用的轉換功能,但爲什麼不只是做一個直接比較?這只是一個字符串,所以將它與從PHP獲得的哈希值進行比較? – kinakuta 2011-06-10 08:09:56

+3

你用'VARCHAR()'而不是'NVARCHAR()'試過了嗎? – 2011-06-10 08:15:32

+1

使用VARCHAR()代替工作,謝謝! – baked 2011-06-10 09:12:16

回答

0

我沒有SQL服務器來測試此,但CONVERT命令可能會產生與240多名拖尾的空白NVARCHAR(如您已指定NVARCHAR(255))

嘗試將NVARCHAR到要測試的ID的長度:

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

嘗試在CONVERT中使用不同的長度 - 是否有區別?

0

一兩件事情是最有可能的問題:

  1. 無論是該行的ID列有不完全等於'12290'(如額外的空格)的值
  2. 還是CONVERT函數產生這樣一個值

在任何情況下,標準的調試方法是使用SQL查詢來選擇該ID字段的字符串長度和返回值CONVERT;如果其中任何一個不等於5,您找到了該錯誤。

或者,您可以執行包括數據在內的表的轉儲,並查看生成的INSERT語句以查看數據庫說該列中的值是什麼。

3

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; 
?> 

輸出:

[email protected]:~$ 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