Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Password_hash() dan password_verify() Berfungsi dalam PHP Menghasilkan Keputusan Berbeza?

Mengapa Password_hash() dan password_verify() Berfungsi dalam PHP Menghasilkan Keputusan Berbeza?

Linda Hamilton
Linda Hamiltonasal
2024-10-21 07:03:30947semak imbas

Why Do password_hash() and password_verify() Functions in PHP Produce Different Results?

Percanggahan Pengesahan Kata Laluan dalam Fungsi password_hash() dan password_verify() PHP

Dalam PHP, fungsi password_hash() dan password_verify() adalah biasa digunakan untuk mengendalikan dan mengesahkan kata laluan pengguna dengan selamat. Walau bagaimanapun, senario tertentu boleh membawa kepada percanggahan yang tidak dijangka dalam pemadanan kata laluan.

Pernyataan Masalah

Anda telah melihat percanggahan dalam pemadanan kata laluan apabila menggunakan password_hash() untuk menyulitkan kata laluan dan password_verify() untuk menyemaknya. Anda perasan bahawa hasil password_verify() tidak sejajar dengan kata laluan asal yang tidak disulitkan.

Memahami Percanggahan

Percanggahan berlaku disebabkan sifat algoritma pencincangan . Pencincangan melibatkan penukaran input teks biasa kepada output panjang tetap (dikenali sebagai cincang) yang unik dan tidak dapat diramalkan. Proses ini tidak boleh diterbalikkan, bermakna ia tidak boleh dilaksanakan secara pengiraan untuk mendapatkan semula input asal daripada cincang.

Apabila anda menggunakan password_hash() untuk menyulitkan kata laluan, ia menghasilkan cincang menggunakan algoritma bcrypt. Hash yang disulitkan ini kemudiannya disimpan dalam pangkalan data. Apabila pengguna cuba log masuk, kata laluan yang disediakan dicincang semula menggunakan password_hash() dan dibandingkan dengan cincang yang disimpan.

Menyelesaikan Percanggahan

Untuk memastikan kata laluan yang betul pengesahan, adalah penting untuk menggunakan algoritma dan konfigurasi yang sama yang digunakan semasa kata laluan pada mulanya dicincang. Berikut adalah langkah yang perlu anda lakukan:

  1. Sahkan Algoritma dan Konfigurasi: Sahkan bahawa algoritma yang digunakan dalam password_hash() dalam kedua-dua skrip pendaftaran dan log masuk sepadan dengan yang dikaitkan dengan kata laluan yang disimpan. Secara lalai, password_hash() menggunakan bcrypt, tetapi anda boleh menentukan algoritma lain dengan menyediakan faktor kos yang sesuai.
<code class="php">$password = password_hash($pwd, PASSWORD_DEFAULT); // Using default bcrypt algorithm</code>
  1. Parameter Hashing Konsisten: Jika anda mempunyai menyesuaikan parameter pencincangan, seperti faktor kos atau garam, memastikan ia konsisten dalam kedua-dua skrip pendaftaran dan log masuk. Sebarang variasi dalam parameter ini boleh membawa kepada cincang yang berbeza, walaupun untuk kata laluan input yang sama.
  2. Gunakan Perbandingan Selamat: Apabila menggunakan password_verify() untuk membandingkan kata laluan, elakkan menggunakan perbandingan kesamaan (== atau ===). Sebaliknya, gunakan fungsi password_verify() yang direka khusus untuk tujuan ini, kerana ia boleh mengendalikan serangan pemasaan yang berpotensi mendedahkan corak kata laluan.
<code class="php">if (password_verify($pwd, $password)) {
    // Password matches
}</code>
  1. Pertimbangkan Pernyataan yang Disediakan: Untuk mengelakkan serangan suntikan SQL, pertimbangkan untuk menggunakan pernyataan yang disediakan semasa menanyakan pangkalan data untuk mendapatkan semula kata laluan yang dicincang.

Dengan mengikuti langkah ini, anda boleh memastikan bahawa fungsi password_hash() dan password_verify() berfungsi dengan betul, menyediakan pengendalian dan pengesahan kata laluan yang boleh dipercayai dan selamat.

Atas ialah kandungan terperinci Mengapa Password_hash() dan password_verify() Berfungsi dalam PHP Menghasilkan Keputusan Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn