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

PHP 單向加密演算法比較:crypt() 支援的 DES、MD5、Blowfish 實測

     編輯:PHP 相關知識

前言

crypt() 是 PHP 內建的單向雜湊函式,支援多種演算法。本文實測常見的 Standard DES、Extended DES、MD5、Blowfish 四種模式,並說明適用場景與安全性差異。

程式碼與輸出範例

<?php
$password = 'hello world';

echo "=== crypt() 演算法支援度檢測 ===\n\n";

if (CRYPT_STD_DES === 1) {
    echo "Standard DES:   " . crypt($password) . "\n";
} else {
    echo "Standard DES:   不支援\n";
}

if (CRYPT_EXT_DES === 1) {
    echo "Extended DES:   " . crypt($password) . "\n";
} else {
    echo "Extended DES:   不支援\n";
}

if (CRYPT_MD5 === 1) {
    echo "MD5:            " . crypt($password) . "\n";
} else {
    echo "MD5:            不支援\n";
}

if (CRYPT_BLOWFISH === 1) {
    echo "Blowfish:       " . crypt($password) . "\n";
} else {
    echo "Blowfish:       不支援\n";
}

典型輸出(Linux 環境)

Standard DES:   heXXxxxxxxxx
Extended DES:   _J9..XXxxxxxxxxxxx
MD5:            $1$XXxxxxxx$XXXXXXXXXXXXXXXXXXXX
Blowfish:       $2y$10$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

演算法深度解析

演算法鹽值格式長度安全性建議用途
Standard DES2 字元13 字元極低(1970 年代)❌ 棄用
Extended DES9 字元(_ 開頭)20 字元低❌ 棄用
MD5$1$ + 8 字元34 字元中(已知碰撞)⚠️ 遷移中
Blowfish$2y$ + cost + 22 字元60 字元高(可調成本)✅ 推薦

關鍵安全提醒

⚠️ 重要: 本文示範的 crypt() 直接雜湊不加鹽值,實務上嚴禁用於密碼儲存。PHP 5.5+ 請改用 password_hash() / password_verify(),內建 BCrypt、Argon2i/Argon2id,自動處理鹽值與成本參數。

現代最佳實踐

<?php
// 註冊:雜湊密碼
$hash = password_hash($_POST['password'], PASSWORD_BCRYPT, ['cost' => 12]);
// 儲存 $hash 到資料庫...

// 登入:驗證密碼
if (password_verify($_POST['password'], $hashFromDb)) {
    // 成功
}

// 需要時重新雜湊(如成本參數變更)
if (password_needs_rehash($hashFromDb, PASSWORD_BCRYPT, ['cost' => 14])) {
    $newHash = password_hash($_POST['password'], PASSWORD_BCRYPT, ['cost' => 14]);
    // 更新資料庫
}

總結

  • crypt() 適合學習雜湊原理、相容舊系統,不適合新專案密碼儲存。
  • Blowfish(BCrypt)是目前 PHP 內建最強選項,支援可調運算成本,抵禦暴力破解。
  • 新專案一律使用 password_hash(),零配置、最佳安全實踐內建。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved