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

MD5 演算法原理與應用:從檔案驗證到密碼儲存的正確觀念

     編輯:PHP 相關知識

什麼是 MD5?

MD5 (Message-Digest Algorithm 5) 是廣泛使用的雜湊函式,將任意長度輸入產生 128-bit (32 字元十六進位) 固定長度摘要。特性:

  • 單向不可逆
  • 固定輸出長度
  • 雪崩效應(輸入微小變化 → 輸出劇烈變化)
  • 決定性(相同輸入 → 相同輸出)

常見應用場景

為什麼 MD5 不適合儲存密碼?

  1. 速度太快:現代 GPU 每秒可計算數十億次 MD5,暴力破解極易。
  2. 無鹽值:相同密碼產生相同雜湊,彩虹表可秒破。
  3. 碰撞攻擊:已找到碰撞對,理論上可構造不同輸入產生相同 MD5。

正確密碼雜湊:bcrypt / Argon2

<?php
// PHP 5.5+ 內建
$hash = password_hash($password, PASSWORD_DEFAULT); // 目前預設 bcrypt
// 或指定 Argon2id (PHP 7.2+)
$hash = password_hash($password, PASSWORD_ARGON2ID);

// 驗證
if (password_verify($password, $hash)) {
    // 成功
}

// 重新雜湊(當演算法升級或 cost 變更)
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
    $new_hash = password_hash($password, PASSWORD_DEFAULT);
    // 更新資料庫
}

MD5 仍可接受的用途

  • 非安全性關鍵的快取鍵、ETag、檔案去重索引。
  • 舊系統相容性遷移期(配合鹽值、雙層雜湊),但應規劃移除。
  • 教學示範雜湊概念。

線上工具與指令

# Linux/Mac
md5sum file.txt
echo -n "string" | md5sum

# PHP
md5('string');           // 32 字元十六進位
md5('string', true);     // 16 位元組二進位
hash('md5', 'string');   // 通用介面

結語

MD5 是經典雜湊函式,適合完整性驗證、非安全索引;嚴禁用於密碼儲存。現代專案請全面改用 password_hash() / password_verify()(bcrypt/Argon2),並啟用 HTTPS、雙因子驗證等纵深防禦。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景用途注意事項
檔案完整性驗證下載軟體對比官方公布 MD5,確認未被竄改/損壞需從官方管道取得正確雜湊值
密碼儲存(舊做法)資料庫存 MD5(password) 而非明文現已不安全,請見下節
快取鍵/去重以內容 MD5 作為 key,快速比對碰撞機率極低但非零
簽章驗證API 參數加鹽後 MD5 簽章,防竄改需搭配 HTTPS、時間戳、Nonce