2011-12-29 66 views
1

我用下面的代碼來存儲用戶密碼到MySQL表的密碼列是一個BINARY(20)類型:mysql unhex()不能在linux服務器上工作?

$salted_hash = sha1($salt . $password); 
$sql = sprintf("INSERT INTO foo(user, password) VALUES ('guest', UNHEX('%s'))", $salted_hash); 

的選擇查詢匹配密碼的樣子:

$salted_hash = sha1($salt . $password); 
$sql = sprintf("SELECT `userID` FROM `foo` WHERE `user`='guest' AND `password`=UNHEX('%s')", $salted_hash); 

代碼工作當我連接到在Windows或Mac機器上運行的Web服務器時很好。然而,我的產品網絡主機是一臺Linux機器,並且SELECT在那裏失敗。

我只能phpMyAdmin我的網絡主機(mhpMyAdmin版本3.4.7.1)。通過phpmyadmin我執行以下查詢:

SELECT UNHEX('3530280EDB5AA715929266D1D6F0423ABC27B104') 

顯示的結果是相同數量的十六進制數字3530280EDB5AA715929266D1D6F0423ABC27B104,這似乎表明UNHEX功能是不是做在Linux上任何事情。

如果我在Sequel Pro在Mac上執行相同的查詢,我得到50(ÛZ§fÑÖðB:¼'±

我不確定發生了什麼事以及在哪裏尋找。我想或者phpMyAdmin不能顯示二進制文件,或者確實有一些與UNHEX有關的問題(似乎不像)任何幫助表示讚賞。

+0

什麼'SELECT UNHEX(BINARY'3530280EDB5AA715929266D1D6F0423ABC27B104')'show? – 2011-12-29 18:34:53

+0

它顯示'3530280edb5aa715929266d1d6f0423abc27b104''表示它將十六進制字符串轉換爲小寫。那是什麼意思? – 2011-12-29 18:41:39

回答

1

看起來這是一個可配置的設置:"Show binary contents as HEX"。我試過你在同一臺服務器上的查詢...

SELECT UNHEX('3530280EDB5AA715929266D1D6F0423ABC27B104') 

...但使用兩個不同的客戶端。我可以確認phpMyAdmin以您找到的方式轉換二進制輸出。您可以仔細檢查,確保輸出是正確的:

SELECT HEX(UNHEX('3530280EDB5AA715929266D1D6F0423ABC27B104'))='3530280EDB5AA715929266D1D6F0423ABC27B104' 

...,這應該返回1,或運行帶有簡單的PHP腳本的原始查詢。總結:UNHEX()沒有錯。

我使用的大多數託管服務實際上都允許外部MySQL客戶端,您只需要在控制面板中啓用它。確保不是這種情況。如果您可以連接Sequel Pro,那麼使用愚蠢的Web客戶端很愚蠢。

我建議你進一步調試你的PHP代碼。我不清楚你如何構建哈希來匹配(你是否在其他查詢中檢索salt?)。

+0

鹽在我的php腳本中被硬編碼。像這樣:'$ salt ='mmm ... salty'; – 2011-12-30 05:11:49

+0

那麼,使用鹽的目標之一是重複的密碼會生成不同的哈希值......但它不應該影響當前的問題。正如我所說:進一步調試。 – 2011-12-30 08:28:45

相關問題