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

Laravel 的 Crypt 和 Hash 不是同一类工具:前者用于对称加密(可逆),后者用于单向哈希(不可逆)。选错会导致数据无法还原或安全漏洞。
什么时候该用 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 不匹配而验证失败。










