Halo semuanya! Minggu lalu, kami menerbitkan bagian
pertama dari artikel ini, yang menyebabkan holivar serius.
Salah satu keluhan utama adalah kurangnya menyebutkan password_hash
dalam artikel, seperti yang kami janjikan, bagian kedua dari materi ini akan mulai sama dengan hash password_hash
menggunakan password_hash
. Kami juga mengingatkan Anda bahwa penulisan artikel ini terinspirasi oleh peluncuran grup baru pada kursus "Backend PHP Developer" , tetapi materi ini tidak ada hubungannya dengan program pelatihan.
Anda dapat mempelajari lebih lanjut tentang program pelatihan di hari open house , dan dengan contoh webinar gratis tentang topik "ServerLess PHP" , Anda dapat mengevaluasi format ceramah.
Mungkin kita akan menyimpulkan kata pengantar yang sudah berlarut-larut ini dan langsung menuju ke artikel.
Kata sandi hash dengan password_hash
Fungsi ini menciptakan hash kata sandi sesuai dengan parameter yang kami tetapkan untuknya. Ini menggunakan algoritma satu arah.
Kita dapat memilih jenis algoritma yang akan digunakan dengan menetapkan salah satu konstanta pilihan kita:
PASSWORD_DEFAULT
dari PHP 5.5 menggunakan Bcrypt sebagai algoritma default. Namun, seiring berjalannya waktu, ini berubah karena algoritma baru atau lebih aman ditemukan atau faktor lainnya ditemukan.PASSWORD_BCRYPT
membuat hash crypt()
. Biasanya berisi 60 karakter, dapat diidentifikasi oleh pengenalnya dalam format "$ 2thn" .PASSWORD-ARGON2I
Argon2 saat ini adalah salah satu algoritma hashing yang paling aman. Ini hanya tersedia jika PHP dikompilasi dengan Argon2.PASSWORD_ARGON2ID
Algoritma hash ini juga milik keluarga Argon2 dan menggunakan versi Argon2ID, bukan I. Agar dapat berfungsi, PHP juga harus dikompilasi menggunakan Argon2.
Fungsi ini juga memiliki parameter opsional, yang terdiri dari array asosiatif yang menerima beberapa kunci sesuai dengan algoritma yang dipilih.
Jika Anda lebih suka menggunakan Bcrypt, kunci dari urutan ini adalah nilai biaya.
Jika Anda memilih algoritma yang menggunakan Argon2, kunci untuk array asosiatif adalah:
memory_cost
(bilangan bulat yang menunjukkan jumlah maksimum memori yang diperlukan untuk menghitung hash),
time_cost
(bilangan bulat yang menunjukkan waktu maksimum yang diperlukan untuk menghitung hash) dan
thread
(integer lain nomor yang menunjukkan jumlah utas yang digunakan untuk menghitung hash).
Jangan tentukan parameter
salt
di PHP 7.0, jika tidak, Anda akan menerima peringatan tentang pendekatan yang tidak digunakan lagi.
Sekarang kita tahu elemen apa yang diperlukan untuk menggunakan fungsi
password_hash()
. Mari kita lihat bagaimana cara meresepkannya.
echo password_hash("MySuperPass", PASSWORD_DEFAULT); $2y$10$TLayAY8ZaAZ9FE50EylGYO9oEgrb7gsw1yzJemHdBu1gOQfyWrEUm $options = ['cost' => 12,]; echo password_hash("MySuperPass", PASSWORD_BCRYPT, $options); $2y$12$jhmTbxAuZXVtX2y.Jc8iy.dW/NENqVCeq2vuoFI9/oa4./YlzhpYO echo password_hash('rasmuslerdorf', PASSWORD_ARGON2I); $argon2i$v=19$m=1024,t=2,p=2$YzJBSzV4TUhkMzc3d3laeg$zqU/1IN0/AogfP4cmSJI1vc8lpXRW9/S0sYY2i2jHT0
Pada awalnya, disarankan untuk menguji fungsi ini di server Anda dan mengkonfigurasi parameter biaya sehingga pelaksanaan fungsi tersebut membutuhkan waktu kurang dari 100 milidetik pada sistem interaktif.
Skrip dalam contoh di atas akan membantu Anda menetapkan nilai biaya optimal untuk perangkat keras Anda.
Verifikasi Kata Sandi Pengguna
Anda memberi pengguna kesempatan untuk mendaftar di aplikasi baru Anda, mereka dapat memasukkan kata sandi mereka di sana, dan Anda tahu betul bagaimana cara menangani kata sandi ini.
Dengan mem-hashing data sesuai dengan tren keamanan terbaru, Anda tidak menyimpan apa pun dalam bentuk terenkripsi, dan server Anda tersembunyi di ruang bawah tanah dengan kedalaman 10 meter.
Apa sekarang?Sekarang Anda harus mengizinkan pengguna untuk masuk ke aplikasi. Untuk melakukan ini, PHP memiliki fungsi bawaan yang memeriksa kata sandi yang cocok dengan urutan hash. Fungsi ini disebut
password_verify()
. Ini berfungsi seperti ini:
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; if (password_verify('rasmuslerdorf', $hash)) { echo ' !'; } else { echo ' !'; }
Dia memiliki dua parameter, dan keduanya harus memiliki format urutan. Parameter pertama adalah kata sandi yang dimasukkan pengguna ke dalam formulir login akun. Parameter kedua adalah data hash langsung yang akan kami konsultasikan.
Sebagai hasilnya, kami mendapatkan nilai logis, siap digunakan dalam operasi bersyarat. Dengan demikian, kita dapat membiarkan pengguna masuk ke aplikasi atau memberitahukan kepadanya bahwa ada sesuatu yang salah.
Fungsi ini berfungsi karena fakta bahwa pada langkah sebelumnya (ketika kami memiliki kata sandi hash), nilai yang dikembalikan dari
password_hash
termasuk algoritma yang digunakan oleh kami,
cost
dan
salt
.
Dengan demikian, semua informasi yang diperlukan untuk
password_verify()
tersedia untuk kami.
Algoritma sistem registrasi pengguna pada PHP
Saya harap Anda sekarang memahami langkah-langkah keamanan yang diambil pengembang PHP saat menangani kata sandi.
Pertama, Anda perlu memeriksa post-request, dan kemudian memilih dan menghitung jumlah pengguna yang datanya cocok dengan yang dimasukkan.
Jika semuanya berjalan dengan baik, kami memverifikasi kata sandi dan mengirim pengguna ke halaman awal. Kalau tidak, misalnya, pada Javascript kami menampilkan jendela peringatan dengan pemberitahuan kesalahan.
Kesimpulan
Sekarang Anda tahu cara memastikan keamanan aplikasi Anda dan cara menangani kata sandi dengan benar. Mengikuti rekomendasi yang bermanfaat bukan hanya standar yang harus Anda ikuti, tetapi jalur pengembangan yang harus menyenangkan untuk diikuti.
Pelajari teknik baru yang mirip dengan cara Anda baru belajar. Tambahkan fungsionalitas tambahan dan bereksperimen dengan kode hingga Anda mendapatkan keterampilan pengembangan web yang luar biasa - apakah itu PHP atau bahasa lain apa pun yang membuka peluang tidak kurang!
Baca bagian pertama