在 Laravel Eloquent 中使用 MySQL PASSWORD()
Use MySQL PASSWORD() in Laravel Eloquent
我正在编写一个旧游戏的注册码,该游戏使用 PASSWORD() 进行加密。
有没有办法在 Laravel Eloquent 中使用该函数?
当前形式:
public function registerPost(Request $request)
{
$request->validate([
'login' => 'required|min:4|unique:account',
'email' => 'required|email|unique:account',
'password' => 'required|min:8',
'repeat_password' => 'required|same:password',
], [], [
'login' => 'Username',
'password' => 'Password',
'email' => 'E-Mail',
'repeat_password' => 'Repeat password'
]);
$data = $request->all();
if (Account::create($data)) {
return Redirect::to("/registration")->withErrors(['success' => 'Account created']);
}
return Redirect::to("/registration")->withErrors(['message' => 'Account creation failed']);
}
您必须手动进行查询才能实现您的目标。喜欢下面
Account::statement(DB::raw('insert query here'));
为什么不用散列法加密呢?它易于使用且非常安全。
Step1:导入下面的代码
use Illuminate\Support\Facades\Hash;
Step2然后就可以通过这个
使用hash方法了
'password' => Hash::make($data['password']),
请在此处查看文档 source
我建议您不要使用 MySQL PASSWORD() 函数。阅读documentation。它说:
PASSWORD() is used by the authentication system in MySQL Server; you should not use it in your own applications.
此函数在 MySQL 5.7.6 和 MySQL 8.0.11、the PASSWORD() function has been removed 中正式弃用。如果您依赖 PASSWORD() 函数,则无法升级到 MySQL 的当前版本。
使用 SQL 中的任何函数来散列密码都是一个坏主意,因为如果这样做,明文密码(即在散列之前)将出现在您的查询日志和基于语句的二进制文件中日志。这是您应用中的一个安全漏洞,任何审核员都会要求您更改。
相反,在 PHP 中进行密码哈希处理的更好方法是在登录需要根据存储的密码检查输入时使用 password_hash() when storing the password, and password_verify()。
如果您正在使用 Laravel,请考虑使用哈希 class:https://laravel.com/docs/6.x/hashing
关于您对另一个答案的评论:
as i said, its for an old game and we cant change how the password is encrypted. otherwise i would ofc use the hash method.
您需要解决这个问题,或者退出游戏。不安全。
您可以更改应用存储密码的方式。我已经在我编写的一些应用程序中做到了。您无法反向散列,因此无法将现有密码转换为新格式,但实现此目的的方法是开发代码来处理这两种情况。代码应按以下方式工作:
- 在您的帐户中添加一个新列table 以存储新的密码哈希格式。
- 当用户登录时,像往常一样根据旧密码哈希检查用户输入。也就是说,散列用户的输入并将结果与数据库中存储的内容进行比较。
- 如果用户输入的哈希与哈希匹配,则更新数据库:将新格式的哈希存储在新密码列中,并将 NULL 分配给旧密码列。
- 更改登录代码,使其获取两列,如果旧密码列为 NULL,则使用新方法对用户输入进行哈希处理,并将其与新密码列进行比较。
逐渐地,当每个用户登录时,他们的密码将是 "upgraded." 一旦他们全部升级,删除旧密码列并简化您的登录代码以删除旧的哈希方法。
可能会有一些掉队的用户数周或数月从未登录。不要等他们。当所有普通用户都转换了密码后,只需删除旧密码即可。如果散兵游勇的用户回来,他们将不得不进行密码恢复。
我正在编写一个旧游戏的注册码,该游戏使用 PASSWORD() 进行加密。 有没有办法在 Laravel Eloquent 中使用该函数?
当前形式:
public function registerPost(Request $request)
{
$request->validate([
'login' => 'required|min:4|unique:account',
'email' => 'required|email|unique:account',
'password' => 'required|min:8',
'repeat_password' => 'required|same:password',
], [], [
'login' => 'Username',
'password' => 'Password',
'email' => 'E-Mail',
'repeat_password' => 'Repeat password'
]);
$data = $request->all();
if (Account::create($data)) {
return Redirect::to("/registration")->withErrors(['success' => 'Account created']);
}
return Redirect::to("/registration")->withErrors(['message' => 'Account creation failed']);
}
您必须手动进行查询才能实现您的目标。喜欢下面
Account::statement(DB::raw('insert query here'));
为什么不用散列法加密呢?它易于使用且非常安全。
Step1:导入下面的代码
use Illuminate\Support\Facades\Hash;
Step2然后就可以通过这个
使用hash方法了'password' => Hash::make($data['password']),
请在此处查看文档 source
我建议您不要使用 MySQL PASSWORD() 函数。阅读documentation。它说:
PASSWORD() is used by the authentication system in MySQL Server; you should not use it in your own applications.
此函数在 MySQL 5.7.6 和 MySQL 8.0.11、the PASSWORD() function has been removed 中正式弃用。如果您依赖 PASSWORD() 函数,则无法升级到 MySQL 的当前版本。
使用 SQL 中的任何函数来散列密码都是一个坏主意,因为如果这样做,明文密码(即在散列之前)将出现在您的查询日志和基于语句的二进制文件中日志。这是您应用中的一个安全漏洞,任何审核员都会要求您更改。
相反,在 PHP 中进行密码哈希处理的更好方法是在登录需要根据存储的密码检查输入时使用 password_hash() when storing the password, and password_verify()。
如果您正在使用 Laravel,请考虑使用哈希 class:https://laravel.com/docs/6.x/hashing
关于您对另一个答案的评论:
as i said, its for an old game and we cant change how the password is encrypted. otherwise i would ofc use the hash method.
您需要解决这个问题,或者退出游戏。不安全。
您可以更改应用存储密码的方式。我已经在我编写的一些应用程序中做到了。您无法反向散列,因此无法将现有密码转换为新格式,但实现此目的的方法是开发代码来处理这两种情况。代码应按以下方式工作:
- 在您的帐户中添加一个新列table 以存储新的密码哈希格式。
- 当用户登录时,像往常一样根据旧密码哈希检查用户输入。也就是说,散列用户的输入并将结果与数据库中存储的内容进行比较。
- 如果用户输入的哈希与哈希匹配,则更新数据库:将新格式的哈希存储在新密码列中,并将 NULL 分配给旧密码列。
- 更改登录代码,使其获取两列,如果旧密码列为 NULL,则使用新方法对用户输入进行哈希处理,并将其与新密码列进行比较。
逐渐地,当每个用户登录时,他们的密码将是 "upgraded." 一旦他们全部升级,删除旧密码列并简化您的登录代码以删除旧的哈希方法。
可能会有一些掉队的用户数周或数月从未登录。不要等他们。当所有普通用户都转换了密码后,只需删除旧密码即可。如果散兵游勇的用户回来,他们将不得不进行密码恢复。