Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 密码重置系统的安全链接哈希_Php_Laravel - Fatal编程技术网

Php 密码重置系统的安全链接哈希

Php 密码重置系统的安全链接哈希,php,laravel,Php,Laravel,只是想确定这是否是“正确的方式”,最重要的是,这是否是“安全的方式”。我正在为想要重置密码(未登录)的人制作一个简单的表单。我不想用Laravel的方式(没有专门的数据库)。我只是发送加密链接,链接有效期为10分钟 public function sendConfirmationLink(Request $request) { $validatedData = $request->validate([ 'email' => 'required|email|ex

只是想确定这是否是“正确的方式”,最重要的是,这是否是“安全的方式”。我正在为想要重置密码(未登录)的人制作一个简单的表单。我不想用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版本差,数据库中存储了类似的代码


是的,我知道拉威尔·奥特可以帮我。我想在密码重置之后再使用我的方法,所以我正在寻找answear,如果它这样安全的话。

来自Laravel的Crypt库使用了
OpenSSL
AES-256-CBC
MAC签名的组合。我认为10分钟的时间应该足够安全

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


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

来自Laravel的Crypt库使用
OpenSSL
AES-256-CBC
的组合,并使用
MAC签名
。我认为10分钟的时间应该足够安全

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


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

安全吗?如果加密算法是安全的,并且密钥从未被泄露,则可能发生这种情况。虽然你真的不需要加密任何东西来实现这一点。您只需要一个不可预测的唯一值。所以像UUID,甚至是一个非常大的随机数,从一个好的熵源就足够了。我不知道为什么要避免将信息存储在数据库中,但即使使用加密,也至少需要将密钥存储在数据库(或其他地方)中。同样,我也不知道为什么要避免这种情况。@Sherif如果我是对的,Laravel的Crypt::使用存储在env中的我的应用程序密钥。所以它很安全。我试着让它变得超级简单。使用该代码,我不需要将记录存储在数据库中。链接通过电子邮件发送给用户,用户可以更改密码。避免将信息存储在数据库中实际上并不会使其更简单,仅供参考。不,它使用你的应用程序密钥并不一定说明它有多安全。@Sammitch with random 32 char我不能将代码限制在特定的时间段内。带有新密码和随机代码输入的Hipotetic表单将向公众公开,因此如果没有节流阀,它可能是不安全的。而且没有数据库,我无法将随机代码存储在任何地方,所以我如何检查这是否是正确的代码。它安全吗?如果加密算法是安全的,并且密钥从未被泄露,则可能发生这种情况。虽然你真的不需要加密任何东西来实现这一点。您只需要一个不可预测的唯一值。所以像UUID,甚至是一个非常大的随机数,从一个好的熵源就足够了。我不知道为什么要避免将信息存储在数据库中,但即使使用加密,也至少需要将密钥存储在数据库(或其他地方)中。同样,我也不知道为什么要避免这种情况。@Sherif如果我是对的,Laravel的Crypt::使用存储在env中的我的应用程序密钥。所以它很安全。我试着让它变得超级简单。使用该代码,我不需要将记录存储在数据库中。链接通过电子邮件发送给用户,用户可以更改密码。避免将信息存储在数据库中实际上并不会使其更简单,仅供参考。不,它使用你的应用程序密钥并不一定说明它有多安全。@Sammitch with random 32 char我不能将代码限制在特定的时间段内。带有新密码和随机代码输入的Hipotetic表单将向公众公开,因此如果没有节流阀,它可能是不安全的。也没有数据库,我无法将随机代码存储在任何地方,所以我如何检查这是否是正确的代码。哦!这是一个非常好的主意,在散列中包含当前密码。消除了每个生成链接一次以上更改的问题。是的,如果您也实现了这一点,您的系统在imo上应该是非常安全的。如果它对您有帮助,请标记我的答案:)谢谢您的帮助。哦!这是一个非常好的主意,在散列中包含当前密码。消除了每个生成链接一次以上更改的问题。是的,如果您也实现了这一点,您的系统在imo上应该是非常安全的。如果它对您有帮助,请标记我的答案:)谢谢您的帮助。