Ini adalah kode SQL untuk membuat tabel (Anda dapat menggunakannya dengan PhpMyAdmin untuk membuat tabel di lingkungan pengembangan Anda)
CREATE TABLE `accounts` ( `account_id` int(10) UNSIGNED NOT NULL, `account_name` varchar(255) NOT NULL, `account_passwd` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `accounts` ADD PRIMARY KEY (`account_id`); ALTER TABLE `accounts` MODIFY `account_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT;
Penting
Pastikan untuk menyetel kolom sandi sebagai varchar .
(Varchar adalah kolom teks dengan panjang variabel. )
Alasannya adalah ukuran hash dari password_hash() dapat berubah (detail lebih lanjut tentang ini nanti)
Jika Anda memerlukan bantuan dengan SQL, Anda dapat menemukan semua yang Anda butuhkan di sini. Cara menggunakan PHP dengan MySQL
Sekarang, Anda perlu terhubung ke database dari skrip PHP Anda
Jika Anda tidak tahu caranya, berikut adalah skrip koneksi PDO sederhana yang dapat langsung Anda gunakan
Cukup edit parameter koneksi untuk membuatnya berfungsi dengan lingkungan Anda sendiri
/* Host name of the MySQL server. */ $host = 'localhost'; /* MySQL account username. */ $user = 'myUser'; /* MySQL account password. */ $passwd = 'myPasswd'; /* The default schema you want to use. */ $schema = 'mySchema'; /* The PDO object. */ $pdo = NULL; /* Connection string, or "data source name". */ $dsn = 'mysql:host=' . $host . ';dbname=' . $schema; /* Connection inside a try/catch block. */ try { /* PDO object creation. */ $pdo = new PDO($dsn, $user, $passwd); /* Enable exceptions on errors. */ $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { /* If there is an error, an exception is thrown. */ echo 'Database connection failed.'; die(); } _
Sekarang Anda siap menambahkan pengguna baru ke tabel
Ini adalah contoh lengkap (pdo. php adalah skrip yang berisi cuplikan koneksi database sebelumnya)
/* Include the database connection script. */ include 'pdo.php'; /* Username. */ $username = 'John'; /* Password. */ $password = 'my secret password'; /* Secure password hash. */ $hash = password_hash($password, PASSWORD_DEFAULT); /* Insert query template. */ $query = 'INSERT INTO accounts (account_name, account_passwd) VALUES (:name, :passwd)'; /* Values array for PDO. */ $values = [':name' => $username, ':passwd' => $hash]; /* Execute the query. */ try { $res = $pdo->prepare($query); $res->execute($values); } catch (PDOException $e) { /* Query error. */ echo 'Query error.'; die(); }
Penting. Dalam contoh ini kami melewatkan langkah-langkah validasi, termasuk
- memeriksa panjang nama pengguna dan kata sandi
- memeriksa karakter yang tidak valid
- memeriksa apakah nama pengguna sudah ada
Cara mengubah kata sandi pengguna
Contoh selanjutnya menunjukkan cara mengubah kata sandi pengguna yang ada
Pertama, dapatkan kata sandi baru dan buat hashnya dengan password_hash()
/* New password. */ $password = $_POST['password']; /* Remember to validate the password. */ /* Create the new password hash. */ $hash = password_hash($password, PASSWORD_DEFAULT);
Kemudian, perbarui baris tabel yang memiliki ID akun yang sama dari pengguna saat ini dan atur hash baru
Catatan. kami menganggap variabel $accountId berisi ID akun
/* Include the database connection script. */ include 'pdo.php'; /* ID of the account to edit. */ $accountId = 1; /* Update query template. */ $query = 'UPDATE accounts SET account_passwd = :passwd WHERE account_id = :id'; /* Values array for PDO. */ $values = [':passwd' => $hash, ':id' => $accountId]; /* Execute the query. */ try { $res = $pdo->prepare($query); $res->execute($values); } catch (PDOException $e) { /* Query error. */ echo 'Query error.'; die(); } _
Cara menggunakan password_verify()
Untuk memverifikasi kata sandi yang diberikan oleh pengguna jarak jauh, Anda perlu menggunakan fungsi password_verify()
password_verify() mengambil dua argumen
- kata sandi yang perlu Anda verifikasi, sebagai argumen pertama
- hash dari password_hash() dari password asli, sebagai argumen kedua
Jika password benar, password_verify() mengembalikan true
Ini sebuah contoh
/* Include the database connection script. */ include 'pdo.php'; /* Login status: false = not authenticated, true = authenticated. */ $login = FALSE; /* Username from the login form. */ $username = $_POST['username']; /* Password from the login form. */ $password = $_POST['password']; /* Remember to validate $username and $password. */ /* Look for the username in the database. */ $query = 'SELECT * FROM accounts WHERE (account_name = :name)'; /* Values array for PDO. */ $values = [':name' => $username]; /* Execute the query */ try { $res = $pdo->prepare($query); $res->execute($values); } catch (PDOException $e) { /* Query error. */ echo 'Query error.'; die(); } $row = $res->fetch(PDO::FETCH_ASSOC); /* If there is a result, check if the password matches using password_verify(). */ if (is_array($row)) { if (password_verify($password, $row['account_passwd'])) { /* The password is correct. */ $login = TRUE; } }
Penting
Anda tidak bisa hanya membandingkan dua hash yang berbeda untuk melihat apakah keduanya cocok
Alasannya adalah password_hash() membuat hash asin
Hash asin menyertakan string acak, bernama "garam", sebagai perlindungan terhadap tabel pelangi dan serangan kamus
Oleh karena itu, setiap hash akan berbeda meskipun kata sandi sumbernya sama
Coba kode berikut. Anda akan melihat bahwa kedua hash berbeda, meskipun kata sandinya sama
$password = 'my password'; echo password_hash($password, PASSWORD_DEFAULT); echo '<br>'; echo password_hash($password, PASSWORD_DEFAULT); _
Catatan
password_verify() hanya bekerja dengan hash yang dibuat oleh password_hash()
Anda tidak dapat menggunakannya untuk memeriksa kata sandi dengan hash MD5 atau SHA
Bagaimana cara meningkatkan keamanan hash
Hash yang dihasilkan oleh password_hash() sangat aman
Tapi Anda bisa membuatnya lebih kuat dengan dua teknik sederhana
- Meningkatkan biaya Bcrypt
- Secara otomatis memperbarui algoritma hashing
biaya Bcrypt
Bcrypt adalah algoritma hashing default saat ini yang digunakan oleh password_hash()
Algoritma ini mengambil parameter opsi bernama “biaya”. Nilai biaya default adalah 10
Dengan menaikkan biaya, Anda dapat membuat hash lebih sulit untuk dihitung. Semakin tinggi biayanya, semakin lama waktu yang dibutuhkan untuk membuat hash
Biaya yang lebih tinggi membuat lebih sulit untuk memecahkan hash. Namun, itu juga membuat pembuatan hash dan pemeriksaan lebih lama juga
Jadi, Anda ingin menemukan kompromi antara keamanan dan beban server
Ini adalah bagaimana Anda dapat menetapkan nilai biaya khusus untuk password_hash()
/* Password. */ $password = 'my secret password'; /* Set the "cost" parameter to 12. */ $options = ['cost' => 12]; /* Create the hash. */ $hash = password_hash($password, PASSWORD_DEFAULT, $options);
Tapi berapa nilai biaya yang harus Anda tetapkan?
Kompromi yang baik adalah nilai biaya yang memungkinkan server Anda membuat hash dalam waktu sekitar 100 md
Berikut adalah tes sederhana untuk menemukan nilai ini
/* User's password. */ $password = 'my secret password'; /* Secure password hash. */ $hash = password_hash($password, PASSWORD_DEFAULT); _0
Setelah Anda menemukan biaya Anda, Anda dapat menggunakannya setiap kali Anda mengeksekusi password_hash() seperti pada contoh sebelumnya
Selalu perbarui hash Anda dengan password_needs_rehash()
Untuk memahami langkah ini, mari kita lihat cara kerja password_hash()
password_hash() membutuhkan tiga argumen
- Kata sandi yang perlu Anda hash
- Algoritma hashing yang ingin Anda gunakan
- Array opsi untuk diteruskan ke algoritme hashing
PHP mendukung berbagai algoritme hashing, tetapi biasanya Anda ingin menggunakan algoritme default
Anda dapat memilih algoritme default dengan menggunakan konstanta PASSWORD_DEFAULT, seperti yang telah Anda lihat pada contoh sebelumnya
Mulai Juni 2020, algoritme default adalah Bcrypt
Namun, PHP dapat mengubah algoritme default di masa mendatang, jika algoritme yang lebih baik dan lebih aman diimplementasikan
Saat itu terjadi, konstanta PASSWORD_DEFAULT akan mengarah ke algoritme baru. Jadi, semua hash baru akan dibuat menggunakan algoritme baru
Tetapi bagaimana jika Anda ingin mengambil semua hash lama Anda, yang dibuat dengan algoritme sebelumnya, dan secara otomatis membuatnya lagi dengan yang baru?
Di sinilah password_needs_rehash() berperan
Fungsi ini memeriksa apakah hash telah dibuat dengan algoritme dan parameter tertentu
Misalnya
/* User's password. */ $password = 'my secret password'; /* Secure password hash. */ $hash = password_hash($password, PASSWORD_DEFAULT); _1
Jika algoritme hashing default saat ini berbeda dengan algoritme yang digunakan untuk membuat hash, password_needs_rehash() menampilkan nilai true
password_needs_rehash() juga memeriksa apakah parameter opsi berbeda
Ini sangat berguna jika Anda ingin memperbarui hash setelah mengubah parameter seperti biaya Bcrypt
Contoh ini menunjukkan bagaimana Anda dapat secara otomatis memeriksa hash kata sandi dan memperbaruinya jika diperlukan, saat pengguna jarak jauh masuk
/* User's password. */ $password = 'my secret password'; /* Secure password hash. */ $hash = password_hash($password, PASSWORD_DEFAULT); _2
Cara mengonversi hash lama secara otomatis
Dalam contoh ini, Anda akan mengimplementasikan skrip sederhana untuk mengonversi hash lama berbasis MD5 secara otomatis untuk mengamankan hash yang dibuat dengan password_hash()
Begini Cara kerjanya
- Saat pengguna masuk, Anda pertama kali memeriksa kata sandinya dengan password_verify()
- Jika login gagal, periksa apakah hash di database adalah hash MD5 jika kata sandinya
- Jika ya, Anda memperbarui hash dengan yang dihasilkan oleh password_hash()
Ini skripnya
/* User's password. */ $password = 'my secret password'; /* Secure password hash. */ $hash = password_hash($password, PASSWORD_DEFAULT); _3
Kesimpulan
Dalam tutorial ini Anda belajar cara menggunakan password_hash() dan password_verify() untuk membuat hash yang aman dari kata sandi Anda (dan mengapa Anda sebaiknya tidak menggunakan MD5)
Anda juga belajar cara membuat hash kata sandi Anda lebih aman dengan menetapkan biaya Bcrypt yang tepat dan secara otomatis mengulangi kata sandi Anda sesuai kebutuhan
Apa fungsi hash dari PHP?
Bagaimana cara menggunakan hashing di PHP?
Bagaimana cara membuat kode hash di PHP?
"; .. .