Как создать хешированный пароль laravel

94

Я пытаюсь создать хешированный пароль для Laravel. Теперь кто-то сказал мне использовать хэш-помощник Laravel, но я не могу его найти или смотрю в неправильном направлении.

Как создать хешированный пароль laravel? И где?

Изменить: я знаю, что это за код, но я не знаю, где и как его использовать, поэтому он возвращает мне хешированный пароль. Если я получу хешированный пароль, я могу вручную вставить его в базу данных.

Грэм
источник
1
Узнайте, как сделать хэш и проверить хеширование в Laravel.
Somnath Muluk
2
Для тех из вас, кто здесь, чтобы просто вручную создать хешированный пароль, вы можете использовать ответ ниже с php artisan tinker. Например,echo Hash::make('yourpassword')
sinaza

Ответы:

184

Хеширование пароля с помощью Bcrypt в Laravel:

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

Это создаст хешированный пароль. Вы можете использовать его в своем контроллере или даже в модели, например, если пользователь отправляет пароль с помощью формы на ваш контроллер с помощью POSTметода, вы можете хэшировать его, используя что-то вроде этого:

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

Здесь $hashedбудет хешированный пароль. В принципе, вы будете делать это при создании / регистрации нового пользователя, поэтому, например, если пользователь отправляет детали , такие как, name, email, usernameи passwordт.д. , используя форму, то перед вставкой данных в базу данных, вы хеширования пароль после проверки данных. Для получения дополнительной информации прочтите документацию .

Обновить:

$password = 'JohnDoe';
$hashedPassword = Hash::make($password);
echo $hashedPassword; // $2y$10$jSAr/RwmjhwioDlJErOk9OQEO7huLz9O6Iuf/udyGbHPiTNuB3Iuy

Итак, вы вставите файл $hashedPasswordв базу данных. Надеюсь, теперь все ясно, и если вы все еще не уверены, то я предлагаю вам прочитать несколько руководств, посмотреть несколько снимков экрана на laracasts.com и tutsplus.com, а также прочитать книгу Laravel, это бесплатная электронная книга , вы можете ее скачать.

Обновление: поскольку OPхочет вручную зашифровать пароль с помощью Laravel Hashбез какого-либо класса или формы, поэтому это альтернативный способ использования artisan tinkerиз командной строки:

  1. Перейдите в командную строку / терминал
  2. Перейдите к Laravelустановке (корневой каталог вашего проекта)
  3. Используйте cd <directory name>и нажмите ввод из командной строки / терминала
  4. Затем напишите php artisan tinkerи нажмите ввод
  5. Затем написать echo Hash::make('somestring');
  6. Вы получите хешированный пароль на консоли, скопируете его и сделаете все, что хотите.

Обновление (Laravel 5.x):

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

Альфа
источник
Но где мне это делать. Я сталкивался с этим несколько раз.
Грэм
Я думаю, что задал неправильный вопрос. Моя база данных (которую я получил от кого-то другого) содержит только хешированные пароли для пользователей. Теперь я хочу создать пароль, который должен быть хеширован laravel. Как я могу создать хешированный пароль, чтобы я мог ввести его в базу данных.
Грэм
Это то, что я ответил: чтобы сохранить пароль, dbвам нужно его зашифровать, чтобы вы, используя простой пароль, зашифруете его, Hash::make('passwordstring');а затем сохраните этот хешированный пароль в базе данных.
Альфа
Но как мне это сделать? Если я, например, создаю файл php, это не сработает. Как вы понимаете, я новичок в Laravel
Грэм
Думаю, у меня все еще вводящий в заблуждение вопрос. Потому что я понимаю, о чем вы говорите. Но где мне использовать этот код? В каком файле или ...? Потому что я собираюсь использовать это только один раз. Это не для какой-то формы, что я могу добавить пользователя или что-то в этом роде.
Грэм
17

Laravel 5 использует bcrypt. Так что вы тоже можете это сделать.

$hashedpassword = bcrypt('plaintextpassword');

вывод которого вы можете сохранить в поле пароля таблицы базы данных.

Ссылка Fn: bcrypt

Нагендра Рао
источник
Откуда у вас эта функция, она не является частью PHP или Laravel?
martinstoeckli
1
@martinstoeckli О, это вспомогательная функция в L5, laravel.com/docs/5.0/hashing#basic-usage
Нагендра Рао
Похоже, он был представлен в недавнем Laravel 5.1 laravel.com/docs/5.1/helpers#method-bcrypt
Нагендра Рао
2
@Fusion bcrypt - это алгоритм хеширования, а не алгоритм шифрования, с хешированием вы не можете вернуть простой текст после того, как для него сгенерирован хеш. В этом весь смысл алгоритма хеширования. Единственное, что вы можете сделать, это проверить, совпадает ли простой текст с имеющимся у вас хешем.
Nagendra Rao
1
@FreddySidauruk Это не сработает, потому что bcrypt каждый раз генерирует разные хеши, даже если входной пароль тот же. Вам нужно будет использовать этот checkметод: if (Hash::check('secret', $hashedPassword)) { // The passwords match... }Ссылка: laravel.com/docs/5.1/hashing Изменить: не забудьте проголосовать за ответ, если он вам помог;)
Нагендра Рао,
11

Фасад 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

Прашант Барве
источник
7

Чтобы сохранить пароль в базе данных, сделайте хэш пароля и затем сохраните.

$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 
}
Сомнатх Мулук
источник
4
Мне нравится этот ответ, потому что он сообщает, где находится хеш (Illuminate \ Support \ Facades \ Hash)
shintaroid
6

Если вы хотите понять, как прекрасно работает 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 ));

Хешированный пароль такой же, как пароль bcrypt laravel 5.x. Не нужно указывать соль и стоимость, она примет значения по умолчанию.

Эти методы были реализованы в классе laravel, но если вы хотите узнать больше, просмотрите официальную документацию: http://php.net/manual/en/function.password-hash.php

Джатхин Прасад
источник
Работает. Может использоваться для сброса пароля, если доступен только доступ к базе данных.
air4x
2

Вы можете использовать следующее:

$hashed_password = Hash::make('Your Unhashed Password');

Вы можете найти дополнительную информацию: здесь

Крис Дж.
источник
1

В BcryptHasher.php вы можете найти хэш-код:

public function make($value, array $options = array())
{
    $cost = isset($options['rounds']) ? $options['rounds'] : $this->rounds;

    $hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost));

            $hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost));
            echo $value.' '.PASSWORD_BCRYPT.' '.$cost.' ';
            echo $hash;die();
    if ($hash === false)
    {
        throw new RuntimeException("Bcrypt hashing not supported.");
    }

    return $hash;
}
hendra1
источник
1
use Illuminate\Support\Facades\Hash;
if(Hash::check($plain-text,$hashed-text))
    {
       return true;
    }
    else
    {
        return false;
    }

например, $ plain-text = 'текст'; $ hashed-text = Hash :: make ('текст');

Дхармендра Патель
источник
Да. Это правильный путь. Необходимо использовать Illuminate \ Support \ Facades \ Hash. Спасибо!
Ноле
1

Вот решение:

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

NB: Используйте код 1-й строки в самом начале вашего контроллера. И последнее, но не менее важное: используйте оставшиеся две строки кода внутри функции вашего контроллера, где вы хотите манипулировать данными после отправки from. Удачного кодирования :)

РашедРахат
источник
0

Сравните пароль в laravel и lumen:

Возможно, функция bcrypt не работает с php7, тогда вы можете использовать приведенный ниже код в laravel и lumen в соответствии с вашими требованиями:

use Illuminate\Support\Facades\Hash;

$test = app('hash')->make("test");
if (Hash::check('test', $test)) {
   echo "matched";
} else {
   echo "no matched";
}

Надеюсь, эта помощь вас порадует :)

Камлеш
источник
-5

хорошо, это отрывок из функции make в hash.php

    $work = str_pad(8, 2, '0', STR_PAD_LEFT);

    // Bcrypt expects the salt to be 22 base64 encoded characters including
    // dots and slashes. We will get rid of the plus signs included in the
    // base64 data and replace them with dots.
    if (function_exists('openssl_random_pseudo_bytes'))
    {
        $salt = openssl_random_pseudo_bytes(16);
    }
    else
    {
        $salt = Str::random(40);
    }

    $salt = substr(strtr(base64_encode($salt), '+', '.'), 0 , 22);

    echo crypt('yourpassword', '$2a$'.$work.'$'.$salt);

Просто скопируйте / вставьте его в файл php и запустите.

Фабиан Валенсия
источник
1
Это ДЕЙСТВИТЕЛЬНО плохая практика. Если вы не очень разбираетесь в криптографии, вам следует просто использовать встроенные уже созданные функции хеширования.
Ник