跳转到主要内容

什么是 Crypt 门面

Laravel 的加密服务借助 OpenSSL 的 AES-256-CBC 加密(或 AES-128-CBC),通过简洁的接口提供数据加解密能力。 Laravel 加密后的值都会带上消息认证码(MAC) 签名。 一旦加密后的值被篡改,就无法再被解密。

配置

生成 APP_KEY

在使用加密之前,需要设置 config/app.php 中的 key。 该值会从 APP_KEY 环境变量中读取。 使用 php artisan key:generate 命令生成安全的密钥。 它会通过 PHP 的安全随机源生成密码学上安全的密钥。
Laravel 在安装时通常会自动生成,并将其保存到 .env 文件中。
绝对不要公开 APP_KEY。一旦该密钥泄露,所有加密数据都可能被解密。

密钥轮换

更改加密密钥会导致所有已认证用户的会话被登出。 因为 Laravel 会加密所有 Cookie(包括 Session Cookie)。 而且旧密钥加密的数据也无法再被解密。 为了缓解此问题,可以在 APP_PREVIOUS_KEYS 中以逗号分隔列出旧密钥。
Laravel 加密时始终使用当前密钥,但在解密时若当前密钥失败,则会按顺序尝试旧密钥。 这样在密钥轮换期间用户仍能继续使用应用。

加密

使用 Crypt 门面的 encryptString 方法进行加密。 加密值使用 OpenSSL 与 AES-256-CBC,且会带上 MAC 签名。
encryptString 不会序列化字符串直接加密。若要加密对象或数组,请使用 encrypt

解密

使用 Crypt 门面的 decryptString 方法解密。 若 MAC 无效或其它原因导致解密失败,会抛出 DecryptException

模型转型(Cast)

在 Eloquent 模型中使用 encrypted 转型可以自动加解密属性。
设置了 cast 之后,模型属性在赋值与读取时会自动加解密。
encrypted:* cast 内部使用 Crypt::encryptCrypt::decrypt。 数据库列类型建议使用 textlongText

实用示例:加密存储个人信息

以下是一个将个人信息(如个人编号、信用卡号等)安全存入数据库的典型模式。

迁移

模型

控制器


小结

下一步

哈希

学习如何安全地对密码进行哈希与校验。

授权

介绍如何使用 Policy 与 Gate 进行访问控制。
最后修改于 2026年7月18日