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

PHP 加密技術全景:從 MD5 到 bcrypt 的選型指南

     編輯:PHP 相關知識

PHP 加密技術全景:從 MD5 到 bcrypt 的選型指南

資料安全是 Web 開發核心環節。本文系統介紹 PHP 內建加密函數特點、適用場景與避坑指南,並推薦業界標準的密碼存儲方案。

單向雜湊(不可逆)

1. MD5

$hash = md5('123456'); // e10adc3949ba59abbe56e057f20f883e
  • 32 位十六進制字符串
  • 速度極快,不適合密碼存儲(易遭彩虹表、GPU 破解)
  • 適用:文件完整性校驗、非敏感數據指紋

2. crypt() / DES / Blowfish / SHA-256 / SHA-512

// 自動鹽值 + Blowfish (bcrypt 前身)
$hash = crypt('mypassword'); // $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
// 驗證
if (crypt('mypassword', $hash) === $hash) { echo 'verified'; }
  • 支援多種算法,鹽值格式標識算法($1$ MD5, $2a$ Blowfish, $5$ SHA-256, $6$ SHA-512)
  • Blowfish 可配置成本參數(cost),抵禦暴力破解
  • 注意:需手動管理鹽值與驗證邏輯,易出錯

3. SHA1

$hash = sha1('123456'); // 7c4a8d09ca3762af61e59520943dc26494f8941b
  • 40 位十六進制,同屬快速雜湊,**不適合密碼**

可逆編碼(非加密)

4. URL 編碼

$encoded = urlencode('https://example.com/道'); // http%3A%2F%2Fexample.com%2F%E9%81%93
$decoded = urldecode($encoded);
  • 用於 URL 參數傳遞,空格轉 +,非字母數字轉 %XX
  • RFC 3986 規範版見文中 myUrlEncode()

5. Base64

$encoded = base64_encode('CraryPrimitiveMan'); // Q3JhcnlQcmltaXRpdmVNYW4=
$decoded = base64_decode($encoded);
  • 二進制轉文本,體積增大 ~33%
  • 用於郵件附件、API 數據傳輸,**非安全加密**

⚠️ 關於「解密」網站的真相

如 cmd5.com 等僅是彩虹表查詢,**無法逆向算法**。若密碼簡單(如純數字 6 位),MD5/SHA1 秒破。對抗策略:

  • 使用高成本慢雜湊(bcrypt, Argon2)
  • 加長密碼、啟用多因子認證
  • **切勿自行組合多層快速雜湊**(如 md5(sha1(md5($pwd)))),無實質安全增益

✅ 密碼存儲黃金標準:phpass / password_hash()

// PHP 5.5+ 內建推薦
$hash = password_hash('my super cool password', PASSWORD_BCRYPT, ['cost' => 12]);
// 驗證
if (password_verify('user input', $hash)) { /* 成功 */ }

或使用經驗證的 phpass 庫(兼容舊版本):

require 'PasswordHash.php';
$hasher = new PasswordHash(8, false); // cost=8, 不可移植(更安全)
$hash = $hasher->HashPassword('password');
$ok = $hasher->CheckPassword('password', $hash);

總結建議

場景推薦方案
用戶密碼password_hash() (bcrypt/Argon2) 或 phpass
API 簽名、完整性校驗HMAC-SHA256 (hash_hmac())
URL 參數、表單傳輸urlencode() / rawurlencode()
二進制文本化base64_encode()
舊系統維護漸進遷移至 password_hash()

安全無小事,選對工具、用對姿勢,才能守住最後一道防線。

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