Rumah > Soal Jawab > teks badan
Kebelakangan ini saya cuba melaksanakan keselamatan saya sendiri pada skrip log masuk yang saya temui di internet. Selepas bertungkus-lumus belajar cara membuat skrip saya sendiri untuk menjana garam untuk setiap pengguna, saya terjumpa password_hash
.
Apa yang saya faham (berdasarkan pembacaan halaman ini), apabila anda menggunakan password_hash
garam sudah dijana dalam talian. Ini adalah benar?
Persoalan saya yang lain, bukankah bijak jika ada 2 jenis garam? Satu terus dalam fail dan satu dalam pangkalan data? Dengan cara ini, jika seseorang merosakkan garam dalam pangkalan data, anda masih boleh menyimpan garam terus dalam fail? Saya membaca di sini bahawa menyimpan garam bukanlah idea yang bijak, tetapi ia sentiasa mengelirukan saya apa yang orang maksudkan dengan itu.
P粉5638310522023-10-14 20:19:57
Ya, anda faham dengan betul, fungsi password_hash() akan menjana garam dengan sendirinya dan memasukkannya ke dalam nilai cincang yang dihasilkan. Adalah betul untuk menyimpan garam dalam pangkalan data, walaupun ia diketahui melakukan tugasnya.
// Hash a new password for storing in the database. // The function automatically generates a cryptographically safe salt. $hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT); // Check if the hash of the entered login password, matches the stored hash. // The salt and the cost factor will be extracted from $existingHashFromDb. $isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb);
Garam kedua yang anda nyatakan (yang disimpan dalam fail) sebenarnya adalah kunci lada atau bahagian pelayan. Jika anda menambahnya sebelum pencincang (sama seperti garam), maka anda menambah lada. Terdapat cara yang lebih baik walaupun, anda boleh mengira cincang dahulu dan kemudian menyulitkan (kedua-dua cara) cincang menggunakan kunci sisi pelayan. Ini membolehkan anda menukar kunci jika perlu.
Bertentangan dengan garam, kunci ini harus dirahsiakan. Orang sering mengelirukan dan cuba menyembunyikan garam, tetapi lebih baik membiarkan garam melakukan tugasnya dan menambah rahsia dengan kunci.
P粉1387117942023-10-14 00:32:17
Adalah disyorkan untuk menggunakan password_hash
untuk menyimpan kata laluan. Jangan pisahkan mereka ke dalam pangkalan data dan fail.
Andaikan kita mempunyai input berikut:
$password = $_POST['password'];
Anda terlebih dahulu mencincang kata laluan dengan melakukan perkara berikut:
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
Kemudian lihat output:
var_dump($hashed_password);
Seperti yang anda lihat, ia dicincang. (Saya andaikan anda mengikuti langkah-langkah ini).
Sekarang anda menyimpan kata laluan cincang ini dalam pangkalan data anda, pastikan lajur kata laluan anda cukup besar untuk menampung nilai cincang (sekurang-kurangnya 60 aksara atau lebih lama) . Apabila pengguna meminta untuk log masuk, anda boleh menyemak kata laluan yang dimasukkan menggunakan cincang dalam pangkalan data, seperti ini:
// Query the database for username and password // ... if(password_verify($password, $hashed_password)) { // If the password inputs matched the hashed password in the database // Do something, you know... log them in. } // Else, Redirect them back to the login page.