Cara membuat kata sandi dengan hash laravel

94

Saya mencoba membuat kata sandi berciri untuk Laravel. Sekarang seseorang mengatakan kepada saya untuk menggunakan hash helper Laravel tetapi saya tidak dapat menemukannya atau saya melihat ke arah yang salah.

Bagaimana cara membuat kata sandi berciri laravel? Dan dimana?

Sunting: Saya tahu apa kodenya tetapi saya tidak tahu di mana dan bagaimana menggunakannya sehingga memberi saya kembali kata sandi yang di-hash. Jika saya mendapatkan kata sandi yang di-hash, maka saya dapat memasukkannya secara manual ke dalam database

Graham
sumber
1
Lihat cara membuat Hash dan Verifikasi Hash di Laravel.
Somnath Muluk
2
Bagi Anda yang berada di sini hanya untuk membuat kata sandi hash secara manual, Anda dapat menggunakan jawaban di bawah ini dengan php artisan tinker. Misalnya,echo Hash::make('yourpassword')
sinaza

Jawaban:

184

Hashing Kata Sandi Menggunakan Bcrypt di Laravel:

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

Ini akan membuat kata sandi berciri. Anda dapat menggunakannya di pengontrol Anda atau bahkan dalam model, misalnya, jika pengguna mengirimkan kata sandi menggunakan formulir ke pengontrol Anda menggunakan POSTmetode, maka Anda dapat mencirikannya menggunakan sesuatu seperti ini:

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

Di sini, $hashedakan berisi kata sandi yang di-hash. Pada dasarnya, Anda akan melakukannya saat membuat / mendaftar pengguna baru, sehingga, misalnya, jika A menyampaikan pengguna Rincian seperti, name, email, usernamedan passwordlain-lain menggunakan formulir, maka sebelum Anda memasukkan data ke dalam database, Anda akan hash kata sandi setelah memvalidasi data. Untuk informasi lebih lanjut, baca dokumentasinya .

Memperbarui:

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

Jadi, Anda akan memasukkan ke $hashedPassworddalam database. Semoga sudah jelas sekarang dan jika masih bingung maka saya sarankan Anda untuk membaca beberapa tutorial, menonton beberapa screen cast di laracasts.com dan tutsplus.com dan juga membaca buku di Laravel, ini adalah ebook gratis , Anda dapat mendownloadnya.

Pembaruan: Karena OPingin mengenkripsi kata sandi secara manual menggunakan Laravel Hashtanpa kelas atau formulir apa pun, jadi ini adalah cara alternatif menggunakan artisan tinkerdari command prompt:

  1. Buka command prompt / terminal Anda
  2. Arahkan ke Laravelinstalasi (direktori root proyek Anda)
  3. Gunakan cd <directory name>dan tekan enter dari command prompt / terminal
  4. Kemudian tulis php artisan tinkerdan tekan enter
  5. Lalu menulis echo Hash::make('somestring');
  6. Anda akan mendapatkan kata sandi hash di konsol, salin, lalu lakukan apa pun yang ingin Anda lakukan.

Perbarui (Laravel 5.x):

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

Alfa
sumber
Tapi di mana saya harus melakukan ini. Saya menemukan ini beberapa kali.
Graham
Saya pikir saya membuat pertanyaan yang salah. Database saya (yang saya dapatkan dari orang lain) hanya memiliki kata sandi yang di-hash untuk pengguna. Sekarang saya ingin membuat kata sandi yang harus di-hash oleh laravel. Bagaimana saya bisa membuat kata sandi berciri sehingga saya bisa memasukkannya di db.
Graham
Itulah yang telah saya jawab, untuk menyimpan kata sandi dbAnda perlu mengenkripsinya jadi, dari kata sandi biasa Anda akan mengenkripsinya menggunakan Hash::make('passwordstring');dan kemudian menyimpan kata sandi berciri ini di database.
The Alpha
Tapi bagaimana saya melakukan ini? Jika saya hanya membuat file php misalnya, ini tidak berfungsi. Seperti yang akan Anda pahami, saya cukup baru di laravel
Graham
Saya pikir saya masih memiliki pertanyaan yang menyesatkan. Karena saya mengerti apa yang Anda katakan. Tetapi di mana saya harus menggunakan kode ini? Di file mana atau ...? Karena saya hanya akan menggunakan ini sekali. Ini bukan untuk beberapa jenis formulir yang dapat saya tambahkan pengguna atau sesuatu.
Graham
17

Laravel 5 menggunakan bcrypt. Jadi, Anda juga bisa melakukan ini.

$hashedpassword = bcrypt('plaintextpassword');

output yang dapat Anda simpan ke bidang kata sandi tabel database Anda.

Referensi Fn: bcrypt

Nagendra Rao
sumber
Dari mana Anda mendapatkan fungsi ini, itu bukan bagian dari PHP atau Laravel, bukan?
martinstoeckli
1
@martinstoeckli Oh iya, ini adalah fungsi pembantu di L5, laravel.com/docs/5.0/hashing#basic-usage
Nagendra Rao
Sepertinya itu diperkenalkan di Laravel 5.1 baru-baru ini laravel.com/docs/5.1/helpers#method-bcrypt
Nagendra Rao
2
@Fusion bcrypt adalah algoritma hashing, bukan algoritma enkripsi, dengan hashing Anda tidak bisa mendapatkan kembali teks biasa setelah hash dibuat untuknya. Ini adalah inti dari algoritma hashing. Satu-satunya hal yang dapat Anda lakukan adalah memeriksa apakah teks biasa cocok dengan hash yang Anda miliki.
Nagendra Rao
1
@FreddySidauruk Itu tidak akan berhasil karena bcrypt menghasilkan hash yang berbeda setiap saat, bahkan jika kata sandi yang dimasukkan sama. Anda harus menggunakan checkmetode: if (Hash::check('secret', $hashedPassword)) { // The passwords match... }Ref: laravel.com/docs/5.1/hashing Edit: Jangan lupa untuk memberi suara positif pada jawaban jika membantu Anda;)
Nagendra Rao
11

Fasad Laravel Hash menyediakan hashing Bcrypt yang aman untuk menyimpan kata sandi pengguna.

Penggunaan dasar membutuhkan dua hal:

Pertama, sertakan Fasad di file Anda

use Illuminate\Support\Facades\Hash;

dan gunakan MakeMetode untuk menghasilkan kata sandi.

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

dan ketika Anda ingin mencocokkan string Hashed Anda dapat menggunakan kode di bawah ini:

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

Anda dapat mempelajari lebih lanjut dengan tautan dokumen Laravel di bawah ini untuk Hashing: https://laravel.com/docs/5.5/hashing

Prashant Barve
sumber
7

Untuk menyimpan kata sandi di database, buat hash kata sandi lalu simpan.

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

Untuk memverifikasi kata sandi, dapatkan kata sandi yang disimpan akun dari database

// $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
sumber
4
Saya suka jawaban ini karena memberi tahu di mana Hash berada (Illuminate \ Support \ Facades \ Hash)
shintaroid
6

Jika Anda ingin memahami cara kerja laravel yang luar biasa, Anda dapat meninjau kelas lengkapnya di Github: https://github.com/illuminate/hashing/blob/master/BcryptHasher.php

Tetapi pada dasarnya ada tiga metode PHP yang terlibat di dalamnya:

$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 ));

Kata sandi yang di-hash sama dengan kata sandi laravel 5.x bcrypt. Tidak perlu memberi garam dan biaya, itu akan mengambil nilai defaultnya.

Metode-metode tersebut telah diterapkan di kelas laravel, tetapi jika Anda ingin mempelajari lebih lanjut, harap tinjau dokumentasi resmi: http://php.net/manual/en/function.password-hash.php

Jathin Prasad
sumber
Bekerja. Dapat digunakan untuk mereset kata sandi jika hanya tersedia akses database.
air4x
2

Anda dapat menggunakan berikut ini:

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

Anda dapat menemukan informasi lebih lanjut: di sini

Chris G
sumber
1

Di BcryptHasher.php Anda dapat menemukan kode hash:

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
sumber
1
use Illuminate\Support\Facades\Hash;
if(Hash::check($plain-text,$hashed-text))
    {
       return true;
    }
    else
    {
        return false;
    }

misalnya- $ plain-text = 'text'; $ hashed-text = Hash :: make ('text');

Dharmendra Patel
sumber
Iya. Ini jalan yang benar. Perlu menggunakan Illuminate \ Support \ Facades \ Hash. Terima kasih!
Nole
1

Inilah solusinya:

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

NB: Gunakan kode baris pertama di awal pengontrol Anda. Terakhir, gunakan dua baris kode lainnya di dalam fungsi pengontrol Anda di mana Anda ingin memanipulasi dengan data setelah dari dikirimkan. Selamat coding :)

RashedRahat
sumber
0

Bandingkan kata sandi di laravel dan lumen:

Ini mungkin karena fungsi bcrypt tidak berfungsi dengan php7 maka Anda dapat menggunakan kode di bawah ini di laravel dan lumen sesuai kebutuhan Anda:

use Illuminate\Support\Facades\Hash;

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

Saya harap, bantuan ini akan membuat Anda bahagia :)

Kamlesh
sumber
-5

ok, ini adalah ekstrak dari fungsi make di 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);

Cukup salin / tempel ke file php dan jalankan.

Fabián Valencia
sumber
1
Ini SANGAT praktik yang buruk. Kecuali Anda sangat mahir dalam kriptografi, Anda harus menggunakan fungsi hashing yang sudah ada.
Nick