October 18, 2011

資料庫欄位設太短導致雜湊值不合

當資料庫操作出現不符預期的結果時,記得檢查欄位長度是否符合需求。


背景

我們在 SQL Database 中建立 Table,在 Table 內建立 Field。

常見的 Field 欄位如 Account, Username, Password 等等。

建立 Field 時除了需要指定資料型態外,有時也需要指定其長度


問題

最近遇到一個狀況,有個學弟不想在 SQL 內用明碼存 password,於是他將使用者註冊的密碼先用 MD5 做 hash ,把 hash 後的值儲存在 field 裡面。

使用者登入時,將密碼做 MD5 hash 之後,再跟資料庫內的 hash 比對,若兩者相同則驗證成功,給予登入。

學弟遇到的問題是,明明註冊時與登入時的密碼完全相同,卻一直無法驗證成功。


原因

檢查了一下後發現,原來是資料庫中 Password 欄位(field) 的長度設太小。

舉例來說,5566 這四個字元的 MD5 hash 是:

8df70f8596744d40783d0fbcdf43a794552d8f52

但是因為學弟的 Password 欄位長度只設定為 25,因此使用者用此密碼註冊後,其儲存在資料庫的 hash 變成:

8df70f8596744d40783d0fbcd

第 25 個字元後面都被截掉了。

雖然不確定這是不是 SQL 內存密碼的正確方式(我猜應該有專門處理密碼雜湊的資料型態?)。

但還是紀錄一下,做個筆記,避免以後出現這種白癡錯誤。