2013-05-31 59 views
3

我有一個系統使用MD5來散列來自我的用戶的密碼並將其存儲到我的數據庫中。 現在,我正在改用另一個使用SHA1(和一個獨特的系統SALT,而不是用戶唯一的)來哈希密碼的系統。最有效的方法來更改密碼的哈希類型(md5爲sha1)

我該如何設法將用戶的舊MD5密碼轉換爲我使用PHP的新SHA1密碼?

+1

爲什麼簡單地從MD5切換到SHA1(即使用鹽)?兩者都有缺陷? password_compat(https://github.com/ircmaxell/password_compat)是一個更好的選擇,並且可以提供很好的面向未來的防護 –

+0

感謝您的建議@MarkBaker,但SHA1哈希方法是系統的要求。此外,由於我甚至無法直接從md5切換到sha1,所以在更改散列類型和修改系統時我會遇到更多麻煩;) 另外,我需要一個快速解決方案。 –

回答

5

您不能轉換md5sha但真的是你的用戶只使用時,他們about to login這樣你就可以修改你的腳本一點做更新自動

// The user is not authticated yet 
$auth = false; 
$updated = false; 

// From your Login form 
$user = $_POST['user']; 
$pass = $_POST['pass']; 

// Check If the username has update password 
$udated = false; // not update 

// I gues you always do this 
$password = $updated ? md5($pass) : sha1($pass); 

// Do the autentication 
// Slect from Database 
// Check the data 
// Set auth 
$auth = true; 

// Then chage the password 
if ($auth == true && !$updated) { 
    $newpassword = sha1($pass); 
    // Connect to DB 
    // Update the Password 
    // Set Status to Updated in DB 
    $udated = true; 
} 

// Better Approch 
if ($auth == true && !$updated) { 
    $newpassword = password_hash($password, PASSWORD_BCRYPT); 
    // Connect to DB 
    // Update the Password 
    // Set Status to Updated in DB 
    $updated = true; 
} 

我用password_hash有一個更好的辦法,因爲密碼它使用BCRYPT這是一個更好的散列算法。 See more information on password_compat

1

如果用戶不重新輸入密碼,則無法更改散列類型。它們是不可逆轉的單向哈希值。我猜,你可以嘗試在彩虹表中進行查找,但是由於某些散列有多個碰撞,所以這100%的時間也無法工作。另外,你的鹽會導致效率低下。這是有鹽的一點。

1

您需要原始明文密碼才能創建它們的SHA1版本。但是,MD5哈希當然是一種方法。所以,除非你碰巧擁有密碼的純文本版本,否則你無法做到你想要的。

4

對不起,你不能。

您希望的最好方式是同時存儲MD5和SHA1版本,並在用戶登錄時填充SHA1內容。只需檢查SHA1版本是否可用,以及是否使用舊的驗證策略。

你應該,最終遷移大多數用戶轉移到新的SHA1/SALT基於透明制度。

1

你可以在你的密碼錶中建立第二個SHA1字段,當用戶登錄時,它可以檢查md5哈希(如果沒有sha1哈希),如果它是正確的,將它重新哈希到sha1中, 。一旦所有用戶切換到SHA1,您可以刪除您的md5字段。 - 你醃過MD5哈希?