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

Graham
źródło
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');

Alpha
źródło
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

Nagendra Rao
źródło
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

Prashant Barve
źródło
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 
}
Somnath Muluk
źródło
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

Jathin Prasad
źródło
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

Chris G.
źródło
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;
}
hendra1
źródło
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');

Dharmendra Patel
źródło
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 :)

RashedRahat
źródło
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 :)

Kamlesh
źródło
-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.

Fabián Valencia
źródło
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