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

PHP 加密大全:MD5、SHA1、crypt、Base64 与密码哈希最佳实践

     編輯:PHP 綜合知識

概览:PHP 常见加密/编码方式分类

类别函数/算法可逆性典型用途
单向哈希MD5、SHA1、SHA256/512不可逆完整性校验、非核心密码存储
加盐哈希crypt()、password_hash()不可逆密码存储首选
编码/可逆Base64、urlencode可逆数据传输、URL 参数

1. MD5 —— 经典但不安全

<?php
$pwd = '123456';
echo md5($pwd); // e10adc3949ba59abbe56e057f20f883e
?>
  • 32 位十六进制字符串
  • md5($str, true) 返回 16 字节二进制
  • ⚠️ 彩虹表极易破解,**严禁用于密码存储**

2. crypt() —— 系统级多算法支持

<?php
$pwd = '123456';
echo crypt($pwd, 'te');        // teMGKvBPcptKo (标准 DES,仅前 2 字符盐)
echo crypt($pwd);              // 自动生成盐值(推荐)
// 验证示例
$hash = crypt('mypassword');
if (crypt('mypassword', $hash) === $hash) { echo '验证通过'; }
?>

算法识别由盐值前缀决定:

  • $1$ → MD5(12 字符盐)
  • $2a$ / $2y$ → Blowfish(cost 参数 04-31)
  • $5$ → SHA-256(16 字符盐,可指定 rounds)
  • $6$ → SHA-512(同 SHA-256)

常量 CRYPT_BLOWFISH 等指示系统支持情况。

3. SHA1 —— 比 MD5 稍强但仍不推荐做密码

<?php
echo sha1('123456'); // 7c4a8d09ca3762af61e59520943dc26494f8941b
?>

40 位十六进制,sha1($str, true) 返回 20 字节二进制。

4. 字典攻击与加盐防御

MD5/SHA1/crypt(DES) 均可被 在线反查库 破解。防御核心:

  1. 每用户唯一随机盐
  2. 高计算成本算法(Blowfish / Argon2)
  3. 不自行拼接哈希(如 md5(md5($pwd).$salt) 仍不安全)

5. URL 编码/解码

<?php
$url = 'https://www.xxx.com/CraryPrimitiveMan/';
$enc = urlencode($url);  // http%3A%2F%2Fwww.xxx.com%2FCraryPrimitiveMan%2F
echo urldecode($enc);    // 还原
?>
  • 空格 → +(非 RFC 3986 标准)
  • RFC 3986 兼容版需自行替换保留字符

6. Base64 编码/解码

<?php
$str = 'CraryPrimitiveMan';
$enc = base64_encode($str); // Q3JhcnlQcmltaXRpdmVNYW4=
echo base64_decode($enc);   // 还原
?>
  • 体积膨胀 ~33%
  • 用于二进制数据在文本协议传输(邮件、Data URI、JWT Payload)

🏆 密码存储黄金标准:password_hash / password_verify (PHP 5.5+)

内置 Bcrypt(默认)/ Argon2(PHP 7.2+),自动处理盐值、cost、算法标识,**零配置最安全**。

<?php
// 注册/修改密码
$hash = password_hash('my super cool password', PASSWORD_DEFAULT);
// 存入数据库:$hash 形如 $2y$10$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi

// 登录验证
if (password_verify('user input', $hash)) { /* 成功 */ }
?>

旧项目兼容:若无 password_hash,引入 password_compat 或 phpass 库(文中示例)。

避坑清单

  • ❌ md5($pwd) / sha1($pwd) 存密码
  • ❌ 固定盐值 / 无盐值
  • ❌ 双重 MD5 等自定义组合
  • ✅ password_hash() + password_verify()
  • ✅ 定期升级算法(password_needs_rehash() 检测)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved