如何创建一个Laravel哈希密码

128
我正在尝试为Laravel创建哈希密码。现在有人告诉我要使用Laravel哈希助手,但我似乎找不到它或者我找错了方向。
我该如何创建Laravel哈希密码?在哪里可以找到?
编辑: 我知道代码是什么,但我不知道在哪里以及如何使用它来获得哈希密码。如果我获得了哈希密码,那么我就可以手动将其插入到数据库中。

1
在Laravel中,查看如何制作哈希和验证哈希。请参考:https://dev59.com/AWAh5IYBdhLWcg3wE_5P#33740080 - Somnath Muluk
9
如果你只是想手动创建一个哈希密码,你可以使用下面的答案和 php artisan tinker。例如:echo Hash::make('yourpassword') - sinaza
最快的手动方法,适用于命令行环境:php artisan tinker 然后 bcrypt("yourpassword") - panjeh
16个回答

233

Laravel 中使用 Bcrypt 进行密码哈希:

$password = Hash::make('yourpassword');

这将创建一个哈希密码。您可以在控制器甚至模型中使用它,例如,如果用户使用表单向您的控制器提交密码,则可以使用类似以下代码的方式进行哈希:

$password = Input::get('passwordformfield'); // password is form field
$hashed = Hash::make($password);

在这里,$hashed会包含加密后的密码。基本上,在创建/注册新用户时使用此方法,例如,如果用户使用表格提交详细信息,如名称电子邮件用户名密码等,则在插入数据到数据库之前,您需要验证数据并对密码进行哈希处理。有关更多信息,请阅读文档

更新:

$password = 'JohnDoe';
$hashedPassword = Hash::make($password);
echo $hashedPassword; // $2y$10$jSAr/RwmjhwioDlJErOk9OQEO7huLz9O6Iuf/udyGbHPiTNuB3Iuy
所以,您将把$hashedPassword插入数据库中。希望现在清楚了,如果仍然感到困惑,那么我建议您阅读一些教程,在laracasts.comtutsplus.com上观看一些屏幕录像,并阅读关于Laravel的书籍,这是一本免费的电子书,您可以下载它。 更新:由于OP想要使用Laravel Hash手动加密密码而没有任何类或表单,因此这是使用命令提示符中的artisan tinker的替代方法:
  1. 进入您的命令提示符/终端
  2. 导航到Laravel安装目录(您的项目根目录)
  3. 使用 cd <目录名>并从命令提示符/终端按Enter键
  4. 然后输入php artisan tinker并按Enter键
  5. 然后输入echo Hash::make('somestring');
  6. 您将在控制台上获得一个哈希密码,复制它然后做任何您想做的事情。

更新(Laravel 5.x):

// Also one can use bcrypt
$password = bcrypt('JohnDoe');


但我应该在哪里做这个?我遇到过几次。 - Graham
1
我觉得我提出了一个错误的问题。我的数据库(从别人那里得到)仅为用户提供了哈希密码。现在我想创建一个应该由Laravel进行哈希处理的密码。我该如何创建一个哈希密码,以便将其输入到数据库中? - Graham
这就是我的回答,如果要将密码保存到 db 中,您需要对其进行加密,因此您需要使用 Hash::make('passwordstring'); 对明文密码进行加密,然后将这个哈希密码保存在数据库中。 - The Alpha
但是我该怎么做呢?如果我只是创建一个 PHP 文件,这并不起作用。正如您所理解的那样,我对 Laravel 还很陌生。 - Graham
我认为我仍然有一个误导性的问题。因为我理解你的意思。但是我应该在哪里使用这段代码?在哪个文件或者...?因为我只会使用一次。它不是用于某种表单,我可以添加一个用户或其他东西。 - Graham
显示剩余10条评论

23

我了解你的痛苦兄弟。你只需要密码哈希值来替换数据库中的密码字段。你可以轻松地从Laravel Tinker获取它。 在任何Laravel项目命令行上键入:

❯ php artisan tinker
Psy Shell v0.9.12 (PHP 7.4.27 — cli) by Justin Hileman
>>> echo Hash::make('123456');
$2y$10$JHK.2MTc9ORMmmlqoF.gg.SwDLnevVSj1oreHParu5PvcPEDOWqe6

然后复制哈希密码以便您的使用情况。


21

Laravel的Hash外观提供了安全的Bcrypt哈希算法,用于存储用户密码。

基本使用需要两个步骤:

第一步,在你的文件中包含该外观。

use Illuminate\Support\Facades\Hash;

使用Make方法生成密码。

$hashedPassword = Hash::make($request->newPassword);

当您想要匹配散列字符串时,您可以使用以下代码:

Hash::check($request->newPasswordAtLogin, $hashedPassword)

您可以通过下面的 Laravel 文档链接了解有关哈希的更多信息: https://laravel.com/docs/5.5/hashing


19

Laravel 5使用bcrypt,所以您也可以这样做。

$hashedpassword = bcrypt('plaintextpassword');

您可以将其输出保存到数据库表的密码字段中。

Fn Ref:bcrypt


你从哪里得到这个函数的,它不是PHP或Laravel的一部分,对吗? - martinstoeckli
1
@martinstoeckli 噢,没错,这是 L5 中的一个辅助函数,http://laravel.com/docs/5.0/hashing#basic-usage - Nagendra Rao
看起来是在最近的Laravel 5.1中引入的 http://laravel.com/docs/5.1/helpers#method-bcrypt - Nagendra Rao
2
@Fusion bcrypt是一种哈希算法,而不是加密算法。使用哈希算法生成哈希值后,无法还原出明文。这就是哈希算法的全部意义所在。唯一能做的事情就是检查明文是否与已有的哈希值匹配。 - Nagendra Rao
1
@FreddySidauruk 那样做行不通,因为bcrypt每次生成的哈希值都不同,即使输入密码相同。你必须使用check方法:if (Hash::check('secret', $hashedPassword)) { // The passwords match... } 参考文献:https://laravel.com/docs/5.1/hashing 编辑:如果这个答案对你有帮助,请不要忘记点赞 ;) - Nagendra Rao
显示剩余3条评论

10

如果您想了解Laravel的工作原理,可以在Github上查看完整的类:https://github.com/illuminate/hashing/blob/master/BcryptHasher.php

但基本上有三种PHP方法涉及到它:

$pasword = 'user-password';
// To create a valid password out of laravel Try out!
$cost=10; // Default cost
$password = password_hash($pasword, PASSWORD_BCRYPT, ['cost' => $cost]);

// To validate the password you can use
$hash = '$2y$10$NhRNj6QF.Bo6ePSRsClYD.4zHFyoQr/WOdcESjIuRsluN1DvzqSHm';

if (password_verify($pasword, $hash)) {
   echo 'Password is valid!';
} else {
   echo 'Invalid password.';
}

//Finally if you have a $hash but you want to know the information about that hash. 
print_r( password_get_info( $password_hash ));

哈希密码与Laravel 5.x的bcrypt密码相同,无需提供盐值和成本,它将采用默认值。

这些方法已在Laravel类中实现,但如果您想了解更多信息,请查看官方文档:http://php.net/manual/en/function.password-hash.php


可行。如果只有数据库访问权限,则可用于重置密码。 - air4x

9

要将密码存储在数据库中,需要对密码进行哈希处理,然后保存。

$password = Input::get('password_from_user'); 
$hashed = Hash::make($password); // save $hashed value

验证密码,从数据库中获取存储在帐户中的密码

// $user is database object
// $inputs is Input from user
if( \Illuminate\Support\Facades\Hash::check( $inputs['password'], $user['password']) == false) {
  // Password is not matching 
} else {
  // Password is matching 
}

5
我喜欢这个答案,因为它告诉了Hash的位置(Illuminate\Support\Facades\Hash)。 - shintaroid

4

以下是解决方案:

use Illuminate\Support\Facades\Hash;    
$password = request('password'); // get the value of password field
$hashed = Hash::make($password); // encrypt the password

注意:在控制器的最开始使用第一行代码。最后但同样重要的是,在表单提交后想要操作数据的控制器函数内使用其余两行代码。愉快的编码:)


2
您可以使用以下内容:
$hashed_password = Hash::make('Your Unhashed Password');

You can find more information: here


2
use Illuminate\Support\Facades\Hash;

您可以使用哈希函数来加密密码 => Hash::make('yourpassword');

您可以使用哈希函数来检查密码是否匹配 => Hash::check($password, $user->password);


1
创建一个函数。
    
    public function bcryptGenerator($password)
    {
        return \bcrypt($password);
    }

调用函数

bcryptGenerator(123456);
// password = 123456

这个问题已经有一个被接受的答案,解释比你的好得多。 - Mike
为什么要将函数包装在另一个函数中?这是一个毫无意义的回答。 - Bowiemtl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接