You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中Crypt::encryptString加密字符串运行结果不符合预期

问题原因

你的User模型中定义了smtp_password字段的访问器getSmtpPasswordAttribute,Laravel的访问器机制会在你通过$模型->属性名的方式读取字段值时,自动触发访问器方法做处理。你在访问器里写了自动解密逻辑,所以:

  • 你直接读取$user->smtp_password时,拿到的是访问器解密后的明文,不是数据库中存储的原始密文
  • 你后续再手动调用Crypt::decryptString()去解密已经是明文的内容,自然会抛出payload is invalid的错误,因为明文不是合法的加密 payload。

如何获取数据库存储的原始密文

如果需要读取没有经过访问器处理的原始密文,可以调用模型的getOriginal()方法:

// 拿到数据库里存的加密字符串
$encrypted = $user->getOriginal('smtp_password');

优化建议

你可以配套添加该字段的修改器,实现存值时自动加密,不需要每次手动调用加密方法:

// 在User模型中添加如下方法
public function setSmtpPasswordAttribute($value)
{
    $this->attributes['smtp_password'] = Crypt::encryptString($value);
}

添加修改器后,存值可以直接写为:

$user->smtp_password = 'MySecretPassword';
$user->save();

Laravel会自动加密后存入数据库,读取时也会自动解密返回明文,无需手动加解密,也能避免重复解密的错误。

内容的提问来源于stack exchange,提问作者user2197774

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 08:54:10