【问题标题】:Secure link hash for password reset system密码重置系统的安全链接哈希
【发布时间】:2020-05-06 07:35:24
【问题描述】:

只是想确定这是否是“正确的方式”,最重要的是它是否是“安全的方式”。我正在为想要重置密码(未登录)的人制作简单的表格。我不想使用 Laravel 方式(没有专门的数据库)。只需我发送加密链接,链接有效期为 10 分钟。

public function sendConfirmationLink(Request $request)
{
    $validatedData = $request->validate([
        'email' => 'required|email|exists:users',
    ]);

    $user = User::where('email', $request->get('email'))->firstOrFail();

    $parameters = [
        'user_id' => $user->id,
        'date' => Carbon::now(),
        'type' => 'password_reset',
    ];

    $passwordResetLink = Crypt::encrypt($parameters);

    SendPasswordResetLink::dispatch($user, $passwordResetLink)->onQueue('high');
}

稍后,我将解密该哈希并更改密码。

public function resetPassword(Request $request)
{
    $validatedData = $request->validate([
        'hash' => 'required',
        'new_password' => 'required|string|min:6|confirmed',
    ]);

    try {
        $decrypted = Crypt::decrypt($request->get('hash'));

        $password = Hash::make($request->get('new_password'));

        $user = User::where('id', $decrypted['user_id'])->firstOrFail();

        $user->password = $password;

        $user->save();
    } catch (DecryptException $e) {
        abort(404);
    }
}

如果我是对的......那个“链接”将非常难以破解,并且只有 10 分钟有效。与存储在数据库中的类似代码的本地 Laravel 版本相比,它是否安全?

是的,我知道 Laravel Auth 可以为我做到这一点。我想使用我的方法而不是密码重置,所以我正在寻找答案,如果它是安全的。

【问题讨论】:

  • 安全吗?如果加密算法是安全的并且密钥永远不会泄露,则可能是这样。尽管您确实不需要加密任何东西来完成此操作。您只需要一个不可预测的唯一值。因此,像 UUID 甚至来自良好熵源的非常大的随机数之类的东西就足够了。我不知道您为什么要避免将信息存储在数据库中,但即使使用加密,您至少需要将密钥存储在数据库中( 或某处)。再说一次,不知道为什么要避免这种情况。
  • @Sherif 如果我是对的 Laravel 的 Crypt:: 使用我存储在 env 中的应用程序密钥。所以它的安全性很好。我试着让它超级简单。使用该代码,我不需要将记录存储在数据库中。链接通过电子邮件发送给用户,用户可以更改密码。
  • 避免将信息存储在数据库中实际上并没有使它变得更简单,仅供参考。不,它使用您的应用密钥这一事实并不一定说明它的安全性。
  • @Sammitch with random 32-char 我不能将该代码限制在特定的时间段内。带有新密码和随机代码输入的 Hipotetic 表单将向公众公开,因此如果没有限制它可能是不安全的。同样没有数据库,我无法在任何地方存储该随机代码,所以我如何检查这是否是正确的代码。

标签: php laravel


【解决方案1】:

Laravel 的 Crypt 库使用 OpenSSLAES-256-CBCMAC signing 的组合。我认为 10 分钟的时间应该足够安全。

一个更严重的问题是,您不能在使用后“禁用”链接。所以理论上每个知道链接的人都可以无限次更改帐户密码(在 10 分钟内)。

该问题的解决方案可能是将当前密码哈希添加到链接哈希中,然后进行比较。在这种情况下,每个链接只能更改一次密码。

【讨论】:

  • 哦!在该哈希中使用当前密码是一个非常好的主意。消除每个生成的链接不止一次更改的问题。
  • 是的,如果你也实现了,你的系统应该是相当安全的 imo。如果对您有帮助,请标记我的回答:)
  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
  • 2010-09-28
相关资源
最近更新 更多