2014-11-06 61 views
0

我的web應用程序使用PHP crypt()函數進行密碼散列。我想使用SHA256算法,所以我相應地生成了用戶的鹽串。問題是我沒有意識到SHA256在我使用的服務器上不受支持(CRYPT_SHA_256)。我剛將應用程序移動到另一臺支持SHA256的服務器,基本上我的用戶都無法登錄,因爲它們的密碼字符串和salt字符串與前一臺服務器生成的哈希相比產生了不同的哈希值。如何使用PHP crypt()函數和SHA256 salt字符串來生成它將在服務器上不支持SHA256時生成的相同哈希?

您認爲最好的解決方案是什麼,而不要求每個用戶更改密碼?

先謝謝你,我欣賞任何有用的想法。

+1

您不應該使用SHA來散列密碼。請使用[password_hash()](http://us1.php.net/manual/en/function.password-hash.php)函數或[phpass](http://www.openwall.com/phpass/) ) 圖書館。 – 2014-11-06 16:24:20

+0

也可以使用hash()函數 – 2014-11-06 16:26:06

+0

我可能是錯誤的,但據我所知使用sha256 algorythm的唯一用戶salt的crypt()函數足夠強大,可以用於哈希密碼。無論如何感謝您的提示,但無論我決定使用什麼散列方法,我仍然必須使用我的舊解決方案,以便爲那些沒有更改密碼的用戶提供訪問權限。 – vadaszp 2014-11-06 16:35:04

回答

0

實際上,crypt()函數應該能夠驗證您現有的哈希,即使它們不是您想要生成的SHA-256。由於新的密碼API內部使用的crypt()函數,它甚至有可能需要新的功能,以驗證您的哈希值:

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

要生成新的哈希值,你應該使用新功能password_hash(),它會自動創建一個安全的鹽。它甚至會計算一個BCrypt哈希,而不是SHA-256,它不適合散列密碼。

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); 
相關問題