【发布时间】: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 表单将向公众公开,因此如果没有限制它可能是不安全的。同样没有数据库,我无法在任何地方存储该随机代码,所以我如何检查这是否是正确的代码。