我有一個系統使用MD5來散列來自我的用戶的密碼並將其存儲到我的數據庫中。 現在,我正在改用另一個使用SHA1(和一個獨特的系統SALT,而不是用戶唯一的)來哈希密碼的系統。最有效的方法來更改密碼的哈希類型(md5爲sha1)
我該如何設法將用戶的舊MD5密碼轉換爲我使用PHP的新SHA1密碼?
我有一個系統使用MD5來散列來自我的用戶的密碼並將其存儲到我的數據庫中。 現在,我正在改用另一個使用SHA1(和一個獨特的系統SALT,而不是用戶唯一的)來哈希密碼的系統。最有效的方法來更改密碼的哈希類型(md5爲sha1)
我該如何設法將用戶的舊MD5密碼轉換爲我使用PHP的新SHA1密碼?
您不能轉換md5
到sha
但真的是你的用戶只使用時,他們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
如果用戶不重新輸入密碼,則無法更改散列類型。它們是不可逆轉的單向哈希值。我猜,你可以嘗試在彩虹表中進行查找,但是由於某些散列有多個碰撞,所以這100%的時間也無法工作。另外,你的鹽會導致效率低下。這是有鹽的一點。
您需要原始明文密碼才能創建它們的SHA1版本。但是,MD5哈希當然是一種方法。所以,除非你碰巧擁有密碼的純文本版本,否則你無法做到你想要的。
對不起,你不能。
您希望的最好方式是同時存儲MD5和SHA1版本,並在用戶登錄時填充SHA1內容。只需檢查SHA1版本是否可用,以及是否使用舊的驗證策略。
你應該,最終遷移大多數用戶轉移到新的SHA1/SALT基於透明制度。
你可以在你的密碼錶中建立第二個SHA1字段,當用戶登錄時,它可以檢查md5哈希(如果沒有sha1哈希),如果它是正確的,將它重新哈希到sha1中, 。一旦所有用戶切換到SHA1,您可以刪除您的md5字段。 - 你醃過MD5哈希?
爲什麼簡單地從MD5切換到SHA1(即使用鹽)?兩者都有缺陷? password_compat(https://github.com/ircmaxell/password_compat)是一個更好的選擇,並且可以提供很好的面向未來的防護 –
感謝您的建議@MarkBaker,但SHA1哈希方法是系統的要求。此外,由於我甚至無法直接從md5切換到sha1,所以在更改散列類型和修改系統時我會遇到更多麻煩;) 另外,我需要一個快速解決方案。 –