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

PHP 加密技術全景:MD5、Crypt、SHA1、Base64、URL 編碼與 bcrypt 最佳實踐

     編輯:PHP 相關知識

PHP 提供多種加密/編碼函數,適用場景各異。本文系統梳理單向哈希(MD5、SHA1、Crypt)、可逆編碼(Base64、URL 編碼)、以及密碼存儲的行業標準 bcrypt(推薦 phpass 库)。

1. MD5 —— 最常見的單向哈希

string md5 ( string $str [, bool $raw_output = false ] )
  • 返回 32 位十六進制字符串(raw_output=true 時為 16 字節二進制)。
  • 不可逆,但可通過彩虹表破解。不適合直接存儲密碼。
  • 示例:md5('123456') → e10adc3949ba59abbe56e057f20f883e

2. Crypt —— 多算法支持的單向哈希

string crypt ( string $str [, string $salt ] )
  • 基於系統可用算法(DES、MD5、Blowfish、SHA-256/512),鹽值格式決定算法。
  • 鹽值前綴對應算法:
    • $1$ → MD5 (12 字符鹽)
    • $2a$ → Blowfish (cost 參數 + 64 位鹽)
    • $5$ → SHA-256 (16 字符鹽,可指定 rounds)
    • $6$ → SHA-512 (16 字符鹽,可指定 rounds)
  • 驗證時必須將完整 crypt 結果作為鹽值傳回:
    $hash = crypt('mypassword'); // 自動生成鹽
    if (crypt('mypassword', $hash) === $hash) { echo '驗證通過'; }

3. SHA1 —— 另一種單向哈希

string sha1 ( string $str [, bool $raw_output = false ] )
  • 返回 40 位十六進制字符串(raw_output=true 為 20 字節二進制)。
  • 同 MD5,不適合密碼存儲。示例:sha1('123456') → 7c4a8d09ca3762af61e59520943dc26494f8941b

4. URL 編碼/解碼 —— 可逆,用於傳輸

string urlencode ( string $str )
string urldecode ( string $str )
  • 非字母數字字符(除 -_.)轉為 %XX,空格變 +。
  • 符合 application/x-www-form-urlencoded 標準。
  • RFC 3986 兼容版需自行替換保留字符(如 !、*、' 等)。

5. Base64 編碼/解碼 —— 可逆,用於二進制安全傳輸

string base64_encode ( string $data )
string base64_decode ( string $data [, bool $strict = false ] )
  • 體積膨脹 ~33%。常用於郵件附件、API Token、圖片內嵌等。
  • strict=true 時遇非法字符返回 FALSE。

6. 密碼存儲黃金標準:bcrypt + phpass

MD5/SHA1/Crypt(無 cost) 均過快,易遭暴力破解。bcrypt 內建 cost 因子(可調整計算耗時),專為密碼設計。

<?php
require_once('phpass-03/PasswordHash.php');
$hasher = new PasswordHash(8, false); // cost=8, 不可移植(更安全)
$hash = $hasher->HashPassword('my super cool password'); // 60 字符串
// 存入數據庫...
// 驗證
$hasher->CheckPassword('wrong', $hash);   // false
$hasher->CheckPassword('my super cool password', $hash); // true
?>
  • PasswordHash(cost, portable):cost 為 2 的指數迭代次數(4-31),portable=false 強制使用 bcrypt。
  • 生成的哈希已包含算法標識、cost、鹽值,驗證時無需單獨存儲鹽。

總結建議

場景推薦方案
用戶密碼存儲phpass (bcrypt)
數據完整性校驗(非安全)MD5 / SHA1
URL 參數傳遞urlencode / urldecode
二進制數據文本化傳輸base64_encode / decode
需自定義算法/鹽的舊系統兼容crypt() 指定鹽值格式

切記:不要嘗試「加密」密碼,要「哈希」密碼,並使用專門為密碼設計的慢速哈希算法(bcrypt/Argon2)。

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