Laravel 5.5如何显示用户输入的原始密码及登录后改密码问题
解决Blade视图无法显示用户原始密码的问题
嘿,这个问题我太熟了!首先得敲个重点:bcrypt是单向哈希算法——一旦密码被哈希后,根本没办法反向解密出原始密码,这也是它用来存密码的核心安全原因。所以你现在直接用{{$staff->password}}输出的,只能看到一串乱码似的哈希字符串,肯定不是用户的原始密码。
下面给你两种解决方案,推荐选第一种,毕竟安全第一:
方案1:遵循安全规范的密码修改流程(强烈推荐)
其实修改密码的场景,根本不需要显示用户的原始密码!正确的逻辑应该是让用户先验证当前密码(证明是本人操作),再输入新密码。这样既安全,也绕开了“显示原始密码”的难题。
对应的Blade代码可以改成这样:
<div class="form-group"> <label class="form-label">当前密码</label> <input class="form-control m-input" type="password" name="current_password" placeholder="请输入当前密码" required> </div> <div class="form-group"> <label class="form-label">新密码</label> <input class="form-control m-input" type="password" name="new_password" placeholder="请输入新密码" required> </div> <div class="form-group"> <label class="form-label">确认新密码</label> <input class="form-control m-input" type="password" name="new_password_confirmation" placeholder="请再次输入新密码" required> </div>
然后在后端控制器里,先验证当前密码是否正确,再更新新密码:
use Illuminate\Support\Facades\Hash; // 验证当前密码 if (!Hash::check($request->current_password, $staff->password)) { return back()->withErrors(['current_password' => '当前密码输入错误,请重试']); } // 更新新密码(自动哈希存储) $staff->update([ 'password' => Hash::make($request->new_password) ]); return back()->with('success', '密码修改成功!');
这个流程完全符合行业安全标准,还能防止恶意用户篡改他人密码。
方案2:业务强制要求显示原始密码(不推荐,有安全风险)
如果你的业务场景真的必须要显示用户的原始密码,那你得在存储密码时做额外处理——除了存bcrypt哈希,还要用Laravel的加密功能把原始密码加密后存在数据库里(比如加个encrypted_password字段)。
具体步骤:
- 给用户表新增
encrypted_password字段(字符串类型,建议长度设为255以上) - 当用户创建或修改密码时,同时存储加密后的原始密码:
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Crypt; // 创建用户时 $staff = \App\Models\Staff::create([ 'name' => $request->name, 'password' => Hash::make($request->password), 'encrypted_password' => Crypt::encryptString($request->password) ]); // 修改密码时 $staff->update([ 'password' => Hash::make($request->new_password), 'encrypted_password' => Crypt::encryptString($request->new_password) ]);
- 在Blade视图里解密显示原始密码:
<input class="form-control m-input" value="{{Crypt::decryptString($staff->encrypted_password)}}" type="password" name="password">
⚠️ 重要提醒:这个方案有极大的安全隐患!一旦数据库被入侵,攻击者可以通过你的APP_KEY解密出所有用户的原始密码,这完全违背了密码存储的安全原则。除非万不得已,否则绝对不建议这么做。
内容的提问来源于stack exchange,提问作者Constantine
相关产品推荐
相关产品推荐

