Rumah  >  Soal Jawab  >  teks badan

Laravel 9 menolak cincang kata laluan yang sah dengan bcrypt

Saya menghabiskan beberapa hari menyelesaikan masalah beberapa kegagalan pengesahan kata laluan dalam Laravel 9. Kata laluan testperson 解析为哈希值 yxc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW. Pertanyaan langsung jadual pangkalan data yang sepadan mengesahkan bahawa ini ialah nilai cincang yang betul. Walau bagaimanapun infrastruktur pengesahan Laravel menolak kata laluan ini dan menolak pengesahan.

Ini bukan perkara biasa. Saya mempunyai berbilang kata laluan yang menghuraikan dengan betul. Contohnya, kata laluan eo 解析为 y$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2, dan Laravel akan mengesahkan kata laluan itu. Mekanisme yang sama mencipta kedua-dua rekod pengguna, walaupun mereka mempunyai kebenaran yang berbeza (ditunjukkan oleh nilai boolean pada rekod).

Saya menemui pepijat dalam fungsi password_verify yang dikenal pasti sebagai mengembalikan negatif palsu dalam soalan Stack Overflow ini dan urutan Treehouse ini.

Secara khusus, ini ialah timbunan dalam Laravel di mana titik kegagalan ini berlaku:

Selepas mengembangkan keseluruhan tindanan, saya menjalankan kod berikut dalam kaedah login pengawal log masuk:

$provider = $this->guard()->getProvider();
$credentials =  $this->credentials($request);
$user = $provider->retrieveByCredentials($credentials);
$password_unhashed = $request['password'];
$password_hashed = $user->getAuthPassword();
$password_verify = password_verify($password_unhashed, $password_hashed);
logger('attemping login', compact('password_verify','password_unhashed','password_hashed'));

Buang konteks ini:

{
"password_verify": false,
"password_unhashed": "testperson",
"password_hashed": "yxc/wAmNCKV.YhpWOfyNoetCj/r3Fs5TyAskgZuIF/LEItWfm7rPW"
}

Jika saya memasukkan kata laluan itu ke dalam pertanyaan SELECT users WHERE password=, saya mendapat pengguna yang saya harapkan.

Apa yang sedang berlaku? Bagaimanakah saya boleh menyelesaikan masalah ini?

P粉270842688P粉270842688178 hari yang lalu393

membalas semua(1)saya akan balas

  • P粉464082061

    P粉4640820612024-03-29 11:37:34

    Saya rasa dakwaan anda bahawa hash yang anda berikan adalah hash "penguji" sebenarnya salah. Memandangkan cincangan adalah sehala, saya tidak dapat memberitahu anda dari mana datangnya cincangan yang ditunjukkan. NOTA: Ia berfungsi pada PHP 7.4, tetapi saya rasa ia tidak akan berfungsi pada PHP 8 dan ke atas kerana pilihan garam dalam passwd_hash() tidak digunakan lagi.

     10, "salt" => substr($testhash, 7, 22));
    $pwhash = password_hash($password, PASSWORD_BCRYPT, $options);
    echo $pwhash."\n";
    $salt = substr($pwhash, 0, 29);
    echo $salt."\n";
    $cryptpw = crypt($password, $salt);
    echo $cryptpw."\n";
    if (password_verify($password, $cryptpw)) {
      echo("Verified.\n");
    } else  {
      echo("NOT Verified.\n");
    }
    if (password_needs_rehash($cryptpw, PASSWORD_BCRYPT, $options)) {
      echo("Needs rehash.\n");
    } else {
      echo("Doesn't need rehash.\n");
    }
    
    /*
    testperson results...
    yxc/wAmNCKV.YhpWOfyNoeVNPMEcYrxepQeFAssFoAaIYs4WLmgZO
    yxc/wAmNCKV.YhpWOfyNoe
    yxc/wAmNCKV.YhpWOfyNoeVNPMEcYrxepQeFAssFoAaIYs4WLmgZO
    Verified.
    Doesn't need rehash.
    
    eo results...
    y$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2
    y$uNWYvMVmagIwQ2eXnVKLCO
    y$uNWYvMVmagIwQ2eXnVKLCOAK1QFQdcRtxbvlghf.Xpg0U1w.N./N2
    Verified.
    Doesn't need rehash.
    */
    ?>

    balas
    0
  • Batalbalas