2011-04-21 108 views
0

我散列密碼,值插入數據庫的方式,爲什麼這個密碼哈希和比較不起作用?

$q = $dbc -> prepare("INSERT INTO accounts (username, email, password, type, gender, joined) 
         VALUES (?, ?, ?, ?, ?, ?)"); 
$q -> execute(array($_POST['username'], $_POST['email'], 
        hash('sha256', $_POST['password'] . date('y/m/d')), 
        $_POST['type'], $_POST['gender'], date('y/m/d'))); 

當我比較再這樣,

if ($count == 1 
&& $info['password'] === hash('sha256', $_POST['password'].$info['joined']) 
&& $info['logcount'] != -1) 

兩個哈希工作,但拋出的值不同?我正在使用完全相同的公式來創建和比較。

我正在接受用戶密碼,將其與當前日期進行醃製,然後進行哈希處理,兩個值都存儲在數據庫中並進行比較,完成同樣的事情,所有在線教程都是關於哈希和創建安全哈希,沒有比較。

感謝

回答

5

是什麼類型joined?如果它是MySQL並且正在使用DATE,那麼它將打印爲「YYYY-MM-DD」。你的鹽很可能不同。您可能想要使用更安全的方式來密碼。

可能的解決方案:

  1. joined一個字符串(VARCHAR MySQL中)。這有效,但效率較低,不會讓您輕鬆地按日期排序/搜索。

  2. 準確匹配日期,因爲您的SQL實施使用它。對於MySQL,例如,使用YYYY-MM-DD。另外,請在前面創建日期字符串,請勿在查詢中撥打date('y/m/d')兩次。先用日期創建一個變量(如「2011-04-21」),將其用於鹽,並將其傳遞到joined,並且應該這樣做。

  3. 使用UNIX_TIMESTAMP將日期轉換爲數字。沒有必要的格式。

+0

我被告知在這裏使用日期作爲鹽?這個主題有很多觀點,我很難看到。 – Version1 2011-04-21 23:07:01

+0

你會如此善良分享你的醃製方法,謝謝你的答案。 – Version1 2011-04-21 23:14:45

+0

兩件事:1.預先抓取日期,2.使用「加入」字符串,或者使用您認爲與您的特定SQL實現完全匹配的格式。 – EboMike 2011-04-21 23:19:11

0

如果你存儲joined爲除varchar類型以外的東西,然後從數據庫中獲得的價值可能不匹配從date()函數的返回值。

以純文本形式存儲joined或使用可從date()和數據庫中提取的值。

2

我想在數據庫中的joined列是DATEDATETIME列?如果是這樣,你可能沒有得到日期格式爲y/m/d,但Y-m-d甚至Y-m-d H:i:s。您需要重新格式化才能獲得相同的值。