首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 登錄頁密碼處理最佳實踐:從 MD5 到現代哈希

     編輯:PHP 綜合知識

⚠️ 安全警示

文中示例使用 MD5 和簡單鹽值屬於過時且不安全的做法。現代項目必須使用 password_hash() / password_verify()(PHP 5.5+),基於 Bcrypt/Argon2 自動處理鹽值與成本因子。

歷史代碼演進分析

方案一:純 MD5(極不推薦)

class XBaseModel {
    public function validatePassword($password) {
        return $this->hashPassword($this->password) === $password;
    }
    public function hashPassword($password) {
        return md5($password); // 彩虹表秒破
    }
}

方案二:雙重 MD5 + 固定鹽值

public function validatePassword($password) {
    return $this->hashPassword($password, $this->salt) === $this->password;
}
public function hashPassword($password, $salt) {
    return md5(md5($password) . $salt); // 仍屬弱哈希
}
public function generateSalt() {
    $chars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $salt = '';
    for ($i = 0; $i < 6; $i++) {
        $salt .= $chars[mt_rand(0, strlen($chars)-1)];
    }
    return $salt;
}

方案三:單次 MD5 + uniqid 鹽值

public function hashPassword($password, $salt) {
    return md5($salt . $password);
}
protected function generateSalt() {
    return uniqid('', true); // 微秒級唯一 ID
}

現代標準寫法(PHP 5.5+)

// 註冊/修改密碼時
$hash = password_hash($password, PASSWORD_ARGON2ID); // 或 PASSWORD_BCRYPT
// 存入數據庫:$hash 已包含算法、成本、鹽值

// 登錄驗證時
if (password_verify($inputPassword, $storedHash)) {
    // 成功
    // 可選:檢查是否需重新哈希(如成本因子升級)
    if (password_needs_rehash($storedHash, PASSWORD_ARGON2ID)) {
        $newHash = password_hash($inputPassword, PASSWORD_ARGON2ID);
        // 更新數據庫
    }
}

關鍵原則總結

  1. 永不自行設計加密方案,使用經驗證的標準庫。
  2. 鹽值必須唯一、隨機、足夠長,password_hash 內建處理。
  3. 哈希算法需可配置,以便未來升級(Argon2id > Bcrypt > PBKDF2 > MD5/SHA)。
  4. 數據庫字段長度 ≥ 255,預留算法升級空間。
  5. HTTPS 傳輸,防止明文密碼被攔截。

遷移建議

舊系統可採用「懶遷移」策略:登錄時驗證舊哈希,通過則用新算法重新哈希並更新庫,逐步淘汰舊方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved