Laravel中怎么实现加密解密_Laravel Crypt与Hash用法【基础】

3次阅读

crypt用于对称加密(可逆),适合api密钥等需解密场景;hash用于单向哈希(不可逆),仅限密码存储。错用会导致数据无法还原或安全漏洞。

Laravel中怎么实现加密解密_Laravel Crypt与Hash用法【基础】

laravelCryptHash 不是同一类工具:前者用于对称加密(可逆),后者用于单向哈希(不可逆)。选错会导致数据无法还原或安全漏洞。

什么时候该用 Crypt,什么时候该用 Hash

直接看用途:

  • Crypt::encryptString() 适合加密用户敏感但需解密的字段,比如 API 密钥、支付回调参数、临时令牌内容
  • Hash::make() 只用于密码存储——它生成的是 bcrypt 哈希值,没有解密函数,验证靠 Hash::check()
  • 别用 Crypt 存密码,也别用 Hash 加密需要还原的数据,否则要么泄露明文,要么永远取不出原始值

Crypt 加密解密必须注意的三个配置点

Laravel 默认使用 OpenSSL + AES-256-CBC,但实际行为高度依赖配置:

  • APP_KEY 必须是 32 字符的 base64 编码字符串php artisan key:generate 自动生成),改错长度或格式会报 InvalidPayloadException
  • 不要手动修改 config/app.php 中的 'cipher' => 'AES-256-CBC',除非你确认所有环境一致且有对应解密能力
  • 加密后的字符串默认带序列化头,如果跨语言解密(如 PHP 加密、Node.js 解密),得用 Crypt::encryptString() 而非 Crypt::encrypt(),后者会序列化整个对象

Hash::make() 验证密码时为什么 Hash::check() 是唯一安全方式

bcrypt 哈希值里自带 salt 和 cost 参数(如 $2y$10$...),所以不能简单用 == 比较:

  • Hash::check('user_input', $hashed_password) 会自动提取 salt 并重算,还带恒定时间比较,防时序攻击
  • 直接 password_verify() 也能用,但绕过了 Laravel 的哈希驱动抽象,失去未来切换算法(如 Argon2)的灵活性
  • 别存明文密码、别用 md5()sha1(),Laravel 8+ 已弃用非 bcrypt 的哈希驱动

最常被忽略的是环境一致性:APP_KEY 一旦在生产环境变更,所有已加密数据永久失效;而 Hash 虽不依赖密钥,但若数据库里混入了旧版 Laravel 用 bcrypt() 手动打的哈希(没带 cost 参数),Hash::check() 可能因默认 cost 不匹配而验证失败。

text=ZqhQzanResources