Jak utworzyć zaszyfrowane hasło laravel


98

Próbuję utworzyć zaszyfrowane hasło do Laravel. Ktoś powiedział mi, żebym użył pomocnika haszującego Laravel, ale nie mogę go znaleźć lub patrzę w złym kierunku.

Jak utworzyć zaszyfrowane hasło laravel? Oraz gdzie?

Edycja: wiem, jaki jest kod, ale nie wiem, gdzie i jak go używać, więc zwraca mi zaszyfrowane hasło. Jeśli otrzymam zaszyfrowane hasło, mogę ręcznie wstawić je do bazy danych


1
Sprawdź, jak wykonać haszowanie i weryfikowanie haszowania w Laravel.
Somnath Muluk

3
Dla tych z Was, którzy są tutaj, aby ręcznie utworzyć zaszyfrowane hasło, możesz użyć poniższej odpowiedzi z php artisan tinker. Np.echo Hash::make('yourpassword')
sinaza

Odpowiedzi:


186

Haszowanie hasła za pomocą Bcrypt w Laravel:

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

Spowoduje to utworzenie zaszyfrowanego hasła. Możesz go użyć w swoim kontrolerze lub nawet w modelu, na przykład, jeśli użytkownik przesyła hasło za pomocą formularza do kontrolera za pomocą POSTmetody, możesz je zaszyfrować, używając czegoś takiego:

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

Tutaj $hashedbędzie zawierać zaszyfrowane hasło. Zasadniczo, można to zrobić przy tworzeniu / rejestracji nowego użytkownika, tak, na przykład, jeśli użytkownik przedkłada szczegóły, takie jak, name, email, usernamei passwordetc za pomocą formularza, a następnie przed tobą wstawić dane do bazy danych, będziesz hash hasło po sprawdzeniu poprawności danych. Aby uzyskać więcej informacji, przeczytaj dokumentację .

Aktualizacja:

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

Więc wstawisz $hashedPassworddo bazy danych. Mam nadzieję, że teraz jest już jasne i jeśli nadal jesteś zdezorientowany, sugeruję przeczytanie kilku samouczków, obejrzenie niektórych rzutów ekranu na laracasts.com i tutsplus.com, a także przeczytanie książki Laravel, to jest darmowy ebook , możesz go pobrać.

Aktualizacja: Ponieważ OPchce ręcznie zaszyfrować hasło za pomocą Laravel Hashbez żadnej klasy lub formularza, jest to alternatywny sposób użycia artisan tinkerz wiersza poleceń:

  1. Przejdź do wiersza poleceń / terminala
  2. Przejdź do Laravelinstalacji (katalog główny projektu)
  3. Użyj cd <directory name>i naciśnij Enter z wiersza poleceń / terminala
  4. Następnie napisz php artisan tinkeri naciśnij enter
  5. Następnie napisz echo Hash::make('somestring');
  6. Otrzymasz zaszyfrowane hasło na konsoli, skopiuj je, a następnie zrób, co chcesz.

Aktualizacja (Laravel 5.x):

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


Ale gdzie mam to zrobić. Trafiłem na to kilka razy.
Graham

Myślę, że zadałem złe pytanie. Moja baza danych (którą otrzymałem od kogoś innego) ma tylko zaszyfrowane hasła użytkowników. Teraz chcę utworzyć hasło, które powinno być zaszyfrowane przez laravel. Jak mogę utworzyć zaszyfrowane hasło, aby móc wprowadzić je do bazy danych.
Graham

Oto, co odpowiedziałem, aby zapisać hasło db, musisz je zaszyfrować, więc ze zwykłego hasła zaszyfrujesz je, Hash::make('passwordstring');a następnie zapiszesz to zaszyfrowane hasło w bazie danych.
Alpha

Ale jak mam to zrobić? Jeśli na przykład utworzę plik php, to nie zadziała. Jak zrozumiesz, jestem całkiem nowy w laravel
Graham

Myślę, że nadal mam mylące pytanie. Ponieważ rozumiem, co mówisz. Ale gdzie mam użyć tego kodu? W którym pliku czy ...? Ponieważ użyję tego tylko raz. Nie chodzi o jakąś formę, w której mogę dodać użytkownika lub coś.
Graham

17

Laravel 5 używa bcrypt. Więc możesz to również zrobić.

$hashedpassword = bcrypt('plaintextpassword');

dane wyjściowe można zapisać w polu hasła tabeli bazy danych.

Odniesienie Fn: bcrypt


Skąd masz tę funkcję, to nie jest część PHP ani Laravel, prawda?
martinstoeckli

1
@martinstoeckli O tak, jest to funkcja pomocnicza w L5, laravel.com/docs/5.0/hashing#basic-usage
Nagendra Rao

Wygląda na to, że został wprowadzony w niedawnym Laravel 5.1 laravel.com/docs/5.1/helpers#method-bcrypt
Nagendra Rao

2
@Fusion bcrypt to algorytm haszujący, a nie algorytm szyfrowania, z haszowaniem nie można odzyskać zwykłego tekstu po wygenerowaniu dla niego skrótu. O to chodzi w algorytmie haszującym. Jedyne, co możesz zrobić, to sprawdzić, czy zwykły tekst pasuje do posiadanego skrótu.
Nagendra Rao,

1
@FreddySidauruk To nie zadziała, ponieważ bcrypt za każdym razem generuje inny hash, nawet jeśli hasło wejściowe jest takie samo. Będziesz musiał użyć checkmetody: if (Hash::check('secret', $hashedPassword)) { // The passwords match... }Ref: laravel.com/docs/5.1/hashing Edycja: Nie zapomnij zagłosować za odpowiedzią, jeśli ci to pomogło;)
Nagendra Rao

11

Fasada Laravel Hash zapewnia bezpieczne mieszanie Bcrypt do przechowywania haseł użytkowników.

Podstawowe użycie wymagało dwóch rzeczy:

Najpierw dołącz fasadę do swojego pliku

use Illuminate\Support\Facades\Hash;

i użyj Makemetody do wygenerowania hasła.

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

a kiedy chcesz dopasować haszowany ciąg, możesz użyć poniższego kodu:

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

Możesz dowiedzieć się więcej, korzystając z linku do dokumentu Laravel poniżej dotyczącego haszowania: https://laravel.com/docs/5.5/hashing


7

Aby przechowywać hasło w bazie danych, utwórz skrót hasła, a następnie zapisz.

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

Aby zweryfikować hasło, pobierz hasło zapisane do konta z bazy danych

// $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
Uwielbiam tę odpowiedź, ponieważ mówi, gdzie znajduje się Hash (Illuminate \ Support \ Facades \ Hash)
shintaroid

6

Jeśli chcesz zrozumieć, jak doskonale działa Laravel, możesz przejrzeć całą klasę na Github: https://github.com/illuminate/hashing/blob/master/BcryptHasher.php

Ale w zasadzie są do tego zaangażowane trzy metody 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 ));

Zaszyfrowane hasło jest takie samo jak hasło laravel 5.x bcrypt. Nie ma potrzeby podawania soli i kosztu, przyjmie wartości domyślne.

Te metody zostały zaimplementowane w klasie laravel, ale jeśli chcesz dowiedzieć się więcej, zapoznaj się z oficjalną dokumentacją: http://php.net/manual/en/function.password-hash.php


Pracuje. Może służyć do resetowania hasła, jeśli dostępny jest tylko dostęp do bazy danych.
air4x

2

Możesz użyć następujących:

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

Więcej informacji znajdziesz: tutaj


1

W BcryptHasher.php można znaleźć kod skrótu:

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;
}

1
use Illuminate\Support\Facades\Hash;
if(Hash::check($plain-text,$hashed-text))
    {
       return true;
    }
    else
    {
        return false;
    }

np. $ zwykły tekst = 'tekst'; $ hashed-text = Hash :: make ('tekst');


Tak. To jest właściwa droga. Musisz użyć Illuminate \ Support \ Facades \ Hash. Dziękuję Ci!
Nole

1

Oto rozwiązanie:

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

Uwaga: użyj kodu pierwszej linii na samym początku swojego kontrolera. Wreszcie, użyj pozostałych dwóch wierszy kodu wewnątrz funkcji kontrolera, w której chcesz manipulować danymi po przesłaniu from. Miłego kodowania :)


0

Porównaj hasło w laravel i lumen:

Może się zdarzyć, że funkcja bcrypt nie będzie działać z php7, wtedy możesz użyć poniższego kodu w laravel i lumen zgodnie ze swoimi wymaganiami:

use Illuminate\Support\Facades\Hash;

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

Mam nadzieję, że ta pomoc cię uszczęśliwi :)


-5

ok, to jest wyciąg z funkcji make w 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);

Po prostu skopiuj / wklej go do pliku php i uruchom.


1
To NAPRAWDĘ zła praktyka. Jeśli nie jesteś bardzo biegły w kryptografii, powinieneś po prostu użyć wbudowanych już utworzonych funkcji haszujących.
Nick
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.