當資料庫操作出現不符預期的結果時,記得檢查欄位長度是否符合需求。
背景
我們在 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 內存密碼的正確方式(我猜應該有專門處理密碼雜湊的資料型態?)。
但還是紀錄一下,做個筆記,避免以後出現這種白癡錯誤。