2012-08-16 21 views
1

我有一個用戶區和管理區的網站。在管理區域中,我有一個用於創建用戶的頁面和一個用於創建管理員的頁面。在用戶和管理員的網頁,我用下面的代碼以哈希密碼:phpass CheckPassword使用不同的鹽?

$hasher = new PasswordHash(8, false); 
$password = $HTTP_POST_VARS['password']; 
$hash = $hasher->HashPassword($password); 
$HTTP_POST_VARS['password'] = $hash; 

對於用戶頁面,檢查密碼的代碼是:

$hasher = new PasswordHash(8, false); 
$check = $hasher->CheckPassword($password, $arrData[$conf['PASSWORD']['FIELD']]); 
if ($check) { 
    //login... 
} 

這完全正常工作。我的用戶密碼被散列並正確檢查密碼。我在管理員登錄頁面上使用相同的代碼,但它不起作用。它從數據庫中提取正確的信息,但是當使用CheckPassword時,密碼不匹配。我認爲這可能與醃製有關,因爲密碼的開始部分似乎是相同的。

順便說一下,我使用PHP 4.3。

+5

你爲什麼使用PHP 4.3? – Martin 2012-08-16 18:17:24

+2

@Martin爲什麼要這麼重要?爲什麼有人可能被迫使用過時的技術有很多原因。只是幫助OP回答這個問題。 – Matt 2012-08-16 18:19:27

回答

2

我認爲這可能與salting有關,因爲密碼的開始部分似乎是相同的。

我不知道爲什麼你會認爲,但是受密碼哈希(!)的開頭部分應該是相同的。 bcrypt創建的哈希使用模塊化crypt格式,該格式不僅包含哈希值,而且還指示所使用的哈希函數,循環次數以及用於創建哈希值的salt。這是相同的部分。見還有一個相關的問題我複製這些信息在從:

這可能不是回答你的問題,但希望澄清一些細節給你,這樣你就不會在錯誤的地方尋找。


我對數據庫設置現在允許50個字符。有誰知道最長的散列phpass會產生?

這取決於所使用的散列函數。在這篇文章中How to manage a PHP application's users and passwords通過Phpass的作者,下面的例子Mysql數據庫架構給出:

create database myapp; 
use myapp; 
create table users (user varchar(60), pass varchar(60)); 

這裏你可以看到,這是一個VARCHAR(60)。這意味着最多60個字符就足夠了。

從另一個角度看,WordPress使用Phpass以及和has the following password column definition

user_pass VARCHAR(64) 

這意味着,64個字符應該夠他們。但請記住,WordPress的也支持其他散列,所以這可能只是一個普遍的價值,而不是Phpass特定的。

看得那麼清楚:

0

我想我弄清楚了。存儲管理員密碼的表不存儲整個散列。我不敢相信我之前沒有意識到這一點。

我已將數據庫設置爲允許50個字符。有誰知道最長的散列phpass會產生?

+1

如果您的字段類型爲VARCHAR,則將長度設置爲255將不會對記錄的結果大小產生太大影響。無論如何,CHAR(255)都會分配一個255長的字符串:這是VARCHAR的用途。 – 2012-08-16 18:38:45

+0

@Sean:我已經更新了關於數據庫中密碼列長度的答案,並且給您另外兩個指向phpass網站的鏈接,這些鏈接詳細解釋了所有內容。 – hakre 2012-08-17 09:06:32