วิธีสร้างรหัสผ่านแฮช laravel


94

ฉันพยายามสร้างรหัสผ่านที่แฮชสำหรับ Laravel ตอนนี้มีคนบอกให้ฉันใช้ Laravel hash helper แต่ดูเหมือนจะหาไม่เจอหรือกำลังมองไปผิดทาง

ฉันจะสร้างรหัสผ่านที่แฮช laravel ได้อย่างไร และที่ไหน?

แก้ไข: ฉันรู้ว่ารหัสคืออะไร แต่ฉันไม่รู้ว่าจะใช้ที่ไหนและอย่างไรจึงให้รหัสผ่านที่แฮชกลับคืนมา หากฉันได้รับรหัสผ่านที่แฮชฉันสามารถแทรกลงในฐานข้อมูลด้วยตนเองได้


1
ตรวจสอบวิธีสร้าง Hash และ Verify Hashใน Laravel
สมนาถมูลสุข

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ด้วยนี่เป็น ebook ฟรีคุณสามารถดาวน์โหลดได้

อัปเดต:เนื่องจากOPต้องการเข้ารหัสรหัสผ่านด้วยตนเองโดยใช้ Laravel Hashโดยไม่มีคลาสหรือรูปแบบใด ๆ ดังนั้นนี่จึงเป็นอีกทางเลือกหนึ่งโดยใช้artisan tinkerจากพรอมต์คำสั่ง:

  1. ไปที่ command prompt / terminal
  2. ไปที่การLaravelติดตั้ง (ไดเรกทอรีรากของโครงการของคุณ)
  3. ใช้cd <directory name>และกด Enter จาก command prompt / terminal
  4. จากนั้นเขียนphp artisan tinkerและกด Enter
  5. จากนั้นเขียน echo Hash::make('somestring');
  6. คุณจะได้รับรหัสผ่านที่แฮชบนคอนโซลคัดลอกแล้วทำสิ่งที่คุณต้องการทำ

อัปเดต (Laravel 5.x):

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


แต่ฉันควรทำที่ไหน ฉันเจอแบบนี้สองสามครั้ง
Graham

ฉันคิดว่าฉันตั้งคำถามผิด ฐานข้อมูลของฉัน (ซึ่งฉันได้มาจากคนอื่น) ได้แฮชรหัสผ่านสำหรับผู้ใช้เท่านั้น ตอนนี้ฉันต้องการสร้างรหัสผ่านที่ควรแฮชโดย laravel ฉันจะสร้างรหัสผ่านที่แฮชเพื่อให้ป้อนรหัสนี้ในฐานข้อมูลได้อย่างไร
Graham

นั่นคือสิ่งที่ฉันตอบไปแล้วในการบันทึกรหัสผ่านdbคุณต้องเข้ารหัสดังนั้นจากรหัสผ่านธรรมดาคุณจะเข้ารหัสโดยใช้Hash::make('passwordstring');จากนั้นบันทึกรหัสผ่านที่แฮชนี้ในฐานข้อมูล
The Alpha

แต่ฉันจะทำอย่างไร หากฉันเพียงแค่สร้างไฟล์ php สิ่งนี้ใช้ไม่ได้ อย่างที่คุณเข้าใจฉันค่อนข้างใหม่สำหรับ laravel
Graham

ฉันคิดว่าฉันยังคงมีคำถามที่ทำให้เข้าใจผิด เพราะฉันเข้าใจสิ่งที่คุณกำลังพูด แต่ฉันควรใช้รหัสนี้ที่ไหน? อยู่ในไฟล์ใดหรือ ... ? เพราะฉันจะใช้เพียงครั้งเดียว ไม่ใช่สำหรับบางรูปแบบที่ฉันสามารถเพิ่มผู้ใช้หรือบางอย่างได้
Graham

17

Laravel 5 bcryptใช้ ดังนั้นคุณสามารถทำได้เช่นกัน

$hashedpassword = bcrypt('plaintextpassword');

ผลลัพธ์ที่คุณสามารถบันทึกลงในฟิลด์รหัสผ่านของตารางฐานข้อมูลของคุณ

Fn อ้างอิง: bcrypt


คุณได้ฟังก์ชั่นนี้มาจากไหนไม่ใช่ส่วนหนึ่งของ PHP หรือ Laravel
martinstoeckli

1
@martinstoeckli โอ้มันเป็นฟังก์ชันตัวช่วยใน L5, laravel.com/docs/5.0/hashing#basic-usage
Nagendra Rao

ดูเหมือนว่าจะเปิดตัวใน Laravel 5.1 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... }Ref: laravel.com/docs/5.1/hashing Edit: อย่าลืมโหวตคำตอบถ้ามันช่วยคุณได้;)
Nagendra Rao

11

ซุ้ม Laravel Hash มีการแฮช Bcrypt ที่ปลอดภัยสำหรับการจัดเก็บรหัสผ่านของผู้ใช้

การใช้งานพื้นฐานต้องการสองสิ่ง:

ขั้นแรกรวม Facade ในไฟล์ของคุณ

use Illuminate\Support\Facades\Hash;

และใช้Makeวิธีการสร้างรหัสผ่าน

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

และเมื่อคุณต้องการจับคู่สตริงแฮชคุณสามารถใช้รหัสด้านล่าง:

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

คุณสามารถเรียนรู้เพิ่มเติมได้จากลิงค์เอกสาร Laravel ด้านล่างสำหรับ Hashing: 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


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

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

เช่น - $ plain-text = 'text'; $ hashed-text = แฮช :: make ('text');


ใช่. นี่คือวิธีที่ถูกต้อง ต้องใช้ Illuminate \ Support \ Facades \ Hash ขอบคุณ!
Nole

1

นี่คือวิธีแก้ปัญหา:

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

หมายเหตุ: ใช้รหัสบรรทัดที่ 1 ที่จุดเริ่มต้นในคอนโทรลเลอร์ของคุณ สุดท้าย แต่ไม่ท้ายสุดให้ใช้โค้ดสองบรรทัดที่เหลือภายในฟังก์ชันของคอนโทรลเลอร์ของคุณที่คุณต้องการจัดการกับข้อมูลหลังจากส่งจาก มีความสุขในการเขียนโค้ด :)


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
นี่เป็นการปฏิบัติที่ไม่ดีจริงๆ หากคุณไม่เชี่ยวชาญในการเข้ารหัสคุณควรใช้ฟังก์ชันแฮชที่สร้างขึ้นแล้ว
นิค
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.