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

Laravel AES加密字段更新正常但查询返回空数组问题及优化咨询

问题原因分析

1. 查询逻辑完全颠倒

你在更新时是将明文通过AES_ENCRYPT加密后存入auth字段,但查询时错误地用AES_DECRYPT处理明文,再和存储的加密值做比较——这相当于拿加密后的二进制值和明文字符串对比,自然无法匹配,返回空结果。

2. 可能存在字段长度截断问题

AES_ENCRYPT的输出长度取决于加密算法(比如AES-128输出16字节),如果你的auth字段是binary类型但长度不足,存储时会截断加密后的二进制数据,导致后续无法正确匹配。

修复后的查询语句

将查询逻辑修正为:把查询用的明文通过AES_ENCRYPT加密,再和auth字段的加密值对比:

DB::select("SELECT * from user WHERE auth = AES_ENCRYPT('748b28e7c414f460607cd8', 'PASS')");

同时确认auth字段长度足够:比如使用binary(16)(对应AES-128算法),避免加密数据被截断。

更优实现方式:使用Laravel内置加密功能

直接写原生SQL的AES加密存在密钥管理、算法一致性等风险,Laravel提供了更安全易用的Crypt facade,推荐采用:

1. 字段类型调整

将auth字段改为text或longtext(Laravel加密后会生成base64编码的字符串,长度较长)。

2. 加密存储

use Illuminate\Support\Facades\Crypt;

// 加密明文并更新字段
$encryptedAuth = Crypt::encryptString('748b28e7c414f460607cd8');
DB::table('user')
    ->where('id', '3045948e-5521-41aa-bb76-4ad290f39053')
    ->update(['auth' => $encryptedAuth]);

3. 明文查询

查询时先加密明文,再匹配字段值:

$encryptedQueryValue = Crypt::encryptString('748b28e7c414f460607cd8');
$user = DB::table('user')->where('auth', $encryptedQueryValue)->first();

核心优势

  • 默认使用AES-256-CBC算法,自带随机初始化向量(IV),安全性更高;
  • 密钥统一存储在.env文件的APP_KEY中,无需手动管理;
  • 避免原生SQL的语法错误和类型匹配问题;
  • 可通过decryptString轻松解密字段值:
    $decryptedAuth = Crypt::decryptString($user->auth);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:50:25