2011-09-26 48 views
1

我使用具有類型時間戳的mysql列醃製用戶密碼,默認值爲CURRENT TIMESTAMP。Mysql NOW()和PHP時間()?

我的兩個mysql和php的時區是相同的。現在

我的問題是這樣的,

$q = $dbc -> prepare("INSERT INTO accounts (password) VALUES (?)"); 
$q -> execute(array(hash('sha512', 'somestaticsalt' . $_POST['password'] . time()))); 

,你可以看到我有一個PHP的時間函數和MySQL的一側是默認的時間戳哈希值。

某處必須有重疊,因爲在用戶輸入正確的信息的情況下,它仍然無法匹配數據庫中的哈希密碼。

我已經嘗試在連接列中插入time(),但它在1970年返回。我也不想將時間戳保存爲INT,因爲這不是正確的事情,所以您的想法是什麼?

+0

不好主意,鹽應該是隨機的。 – 2011-09-26 03:14:45

+0

不,鹽應該是唯一的,不是隨機的,隨機性意味着不唯一。 – pv1

+0

兩者,你的是可預測的,這是問題。 – 2011-09-26 03:17:30

回答

5

你的鹽真的應該是隨機的。

您的代碼小的提升(你可以做的好多了,就像使用bcrypt或SHA512至少一些伸展):

$salt = md5(time() . 'some-other-static-salt'); //more random than time() along. 
$q = $dbc -> prepare("INSERT INTO accounts (password, salt) VALUES (?, ?)"); 
$q -> execute(array(hash('sha512', 'somestaticsalt' . $_POST['password'] . $salt), $salt)); 

現在你不再依賴於CURRENT_TIMESTAMP返回同樣的事情作爲時間(),你有更好的鹽。

編輯:如果你堅持按照你的方式做,看看mysql返回的時間戳列。我敢打賭它看起來像「Y-m-d H:i:s」,而不是像unix時間戳。當然,你應該能夠自己弄清楚。假設這是真的,把它換成時間,你可能會取得一些成功。

+0

葉我會用你的答案,但它是一個謎我爲什麼數字是不一樣的,我使用strtotime(val)...感謝您的輸入和答覆 – pv1

相關問題