Php 密码重置系统的安全链接哈希
只是想确定这是否是“正确的方式”,最重要的是,这是否是“安全的方式”。我正在为想要重置密码(未登录)的人制作一个简单的表单。我不想用Laravel的方式(没有专门的数据库)。我只是发送加密链接,链接有效期为10分钟Php 密码重置系统的安全链接哈希,php,laravel,Php,Laravel,只是想确定这是否是“正确的方式”,最重要的是,这是否是“安全的方式”。我正在为想要重置密码(未登录)的人制作一个简单的表单。我不想用Laravel的方式(没有专门的数据库)。我只是发送加密链接,链接有效期为10分钟 public function sendConfirmationLink(Request $request) { $validatedData = $request->validate([ 'email' => 'required|email|ex
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上应该是非常安全的。如果它对您有帮助,请标记我的答案:)谢谢您的帮助。