
本文介绍使用 laravel 的访问器(accessors)和修改器(mutators)实现敏感字段(如 email、phone、password)的透明加解密:写入时自动加密、读取时自动解密,无需修改现有业务逻辑。
本文介绍使用 laravel 的访问器(accessors)和修改器(mutators)实现敏感字段(如 email、phone、password)的透明加解密:写入时自动加密、读取时自动解密,无需修改现有业务逻辑。
在 Laravel 应用中,对用户敏感信息(如邮箱、手机号、密码)进行数据库层加密是常见安全实践。但若已有成熟业务系统,逐处改造 SQL 查询或模型操作成本极高。此时,Laravel 提供的 Eloquent 访问器与修改器(Accessors & Mutators) 是最优雅的解决方案——它能在模型层面无缝拦截字段的读写行为,实现“写入自动加密、读取自动解密”,对外部调用完全透明。
✅ 实现原理
通过定义 set{Column}Attribute()(修改器)在保存前加密值,get{Column}Attribute()(访问器)在获取时解密值。Laravel 会自动识别并调用这些方法,无需修改任何 SELECT、INSERT 或 UPDATE 语句。
? 示例:为 users 表的敏感字段添加加解密逻辑
在 App\Models\User 模型中添加如下代码:
<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
// 可选:指定哪些字段需被隐藏(如 password),避免意外暴露
protected $hidden = ['password'];
// 加密写入:email、phone、password 字段
public function setEmailAttribute($value)
{
$this->attributes['email'] = encrypt($value);
}
public function setPhoneAttribute($value)
{
$this->attributes['phone'] = encrypt($value);
}
public function setPasswordAttribute($value)
{
$this->attributes['password'] = encrypt($value);
}
// 解密读取:返回明文值
public function getEmailAttribute($value)
{
return $value ? decrypt($value) : null;
}
public function getPhoneAttribute($value)
{
return $value ? decrypt($value) : null;
}
public function getPasswordAttribute($value)
{
return $value ? decrypt($value) : null;
}
}
✅ 效果验证:
- User::find(1)->email → 返回解密后的邮箱字符串(如 user@example.com)
- User::create(['email' => 'test@domain.com', 'phone' => '1234567890']) → 数据库中存储的是加密后的二进制/字符串
- User::select('email')->get() → 结果集合中的 email 值已自动解密
⚠️ 重要注意事项
- 无法在数据库层面搜索加密字段:因数据以密文形式存储,WHERE email = ? 等查询将失效(加密后值不可预测)。如需模糊检索,应额外维护哈希索引(如 email_hash 字段)或使用可搜索加密方案(超出本文范围)。
- encrypt()/decrypt() 依赖 Laravel 的 APP_KEY:确保所有环境使用同一密钥,否则历史数据无法解密。
- 避免对 id、created_at 等非敏感字段误用:仅对明确需保护的列启用。
- 性能影响极小:加解密发生在 PHP 层,单次请求开销可忽略,但高并发场景建议监控内存与 CPU 使用率。
✅ 迁移已有明文数据(可选)
若表中已有未加密的敏感数据,可通过 Artisan 命令批量加密:
php artisan make:command EncryptUserFields
在命令中遍历用户并调用 $user->email = $user->email; $user->save(); 触发修改器,即可完成平滑迁移。
通过该方案,你无需改动任何控制器、服务层或前端代码,即可让整个应用立即具备字段级透明加解密能力——真正实现安全升级与业务零侵入的平衡。











