Cara menggunakan password_hash() dan password_verify di PHP

Assalamu’alaikum ūüôā

Halo, sob. Sebelumnya saya telah membahas tentang masalah Alasan kenapa sebaiknya jangan gunakan base64_encode untuk Password Hashing, sekarang saya akan membahas Cara menggunakan password_hash() dan password_verify() di PHP.

Seperti yang anda ketahui, bahwa agar dapat menimbulkan rasa kepercayaan dari Clien/Pengguna nya, kita sebagai Programmer haruslah tahu cara mengamankan Akun yang mereka buat di dalam website kita.

Dan, pula, kita juga harus menyembunyikan segala privasi Client di Internet agar timbul rasa kepercayaan dari Client nya. Salah satunya adalah melakukan Hashing pada Kata Sandi.

Mungkin, anda lebih tahu tentang fungsi crypt() dan hash() di PHP untuk membuat sebuah Kata Sandi, namun penggunaan nya mungkin lebih sulit dan malah cenderung lebih ribet, karena harus mempertimbangkan semua nya.

Sekarang, anda bisa melakukan Hashing Kata Sandi dengan fungsi khusus untuk kata sandi, yang mana jauh lebih mudah daripada menggunakan fungsi-fungsi sebelumnya, yakni fungsi password_hash() untuk membuat Hash Kata Sandi, sedangkan password_verify() untuk memverifikasikan kata sandi nya.

Penasaran bagaimana cara menggunakan nya? Silahkan anda baca artikel ini, jika anda ingin tau bagaimana caranya ūüôā

Apa itu fungsi password_hash()?

password_hash() merupakan fungsi PHP yang berguna untuk melakukan Hashing pada suatu kata sandi. Fungsi ini telah ada sejak PHP versi 5.5, jadi anda akan aman jika menggunakan fungsi ini.

Ada beberapa cara menggunakannya, namun sebelum itu, saya akan menjelaskan konsepnya terlebih dahulu, berikut di bawah ini:

Konsep fungsi password_hash() pada PHP

Di bawah ini merupakan penjelasan mengenai opsi-opsi nya:

1. string $InputPassword itu merupakan teks/string yang bisa anda isi dengan bebas. Nah, teks inilah yang kemudian akan di konversikan ke dalam Password Hash. Bisa anda isikan dengan sesuka anda ataupun nilai variabel, tentu saja nanti variabel nya tidak di kutip, seperti password_hash($teks, Algoritma, $OpsiAlgoritma);.

2. int $Algo  (atau bisa anda sebut di dalam variabel/selanjutnya akan disebut $Algoritma) itu merupakan Algoritma yang akan di gunakan untuk proses Hashing Kata Sandi, di PHP hanya tersedia dua Algoritma saja, yakni Bcrypt (ada sejak PHP 5.5) dan Argon2i (untuk PHP versi 7.2 atau di atasnya). $Algoritma tentu saja tidak bisa di isi dengan sembarang nilai, hanya bisa di isi dengan nilai tertentu, yakni dengan salah satu nilai/konstan di bawah ini:

  • PASSWORD_DEFAULT¬†– Ini akan menggunakan Bcrypt untuk Algoritma Hashing Kata Sandi yang sudah menjadi algoritma default/bawaan sejak PHP versi 5.5, dan mungkin algoritma bawaan nya akan di ganti di beberapa versi yang akan datang (bisa jadi setelah versi 7.3 nanti) menjadi Argon2I, jika masih ingin gunakan Bcrypt, maka gunakan Opsi¬†PASSWORD_BCRYPT.
    Jika ini di pilih, maka akan menjadi seperti ini konsepnya: password_hash('Masukkan teks disini', PASSWORD_DEFAULT, $OpsiAlgoritma);
  • PASSWORD_BCRYPT¬†– Ini akan menggunakan Algoritma Bcrypt (CRYPT_BLOWFISH) untuk melakukan Hashing Kata sandi, Algoritma ini ada sejak PHP versi 5.5, jadi kemungkinan sangat mendukung untuk pengguna PHP versi lama.
    Jika ini di pilih, maka akan menjadi seperti ini konsepnya: password_hash('Masukkan teks disini', PASSWORD_BCRYPT, $OpsiAlgoritma);
  • PASSWORD_ARGON2I¬†– Ini akan menggunakan Algoritma Argon2i, sebuah algoritma baru yang berhasil memenangkan Password Hashing Competition (PHC) pada bulan Juli tahun 2015 yang lalu, dan baru di implementasikan ke dalam PHP sejak versi 7.2, jadi, Argon2i ini hanya bisa di jalankan pada PHP versi 7.2 atau di atasnya.
    Jika ini di pilih, maka akan menjadi seperti ini konsepnya: password_hash('Masukkan teks disini', PASSWORD_ARGON2I, $OpsiAlgoritma);

Oh, ya, opsi tersebut menggunakan tipe data¬†int¬†karena sebenarnya hanya bisa dimasukkan dengan angka. Namun, karena nilai di atas merupakan konstan yang mana sudah di definisikan dengan angka, maka nilainya bisa di masukkan. Jadi, nilai di atas merupakan Konstan, gak percaya? Silahkan output nilai di atas dengan¬†echo ūüôā

3. array [string $Options => int $Value] (atau bisa anda sebut di dalam variabel/selanjutnya akan di sebut dengan $OpsiAlgoritma) merupakan sebuah opsi/setelan pada Algoritma yang anda gunakan untuk Hashing. Bcrypt dan Argon2i memiliki pengaturan nya sendiri-sendiri.

Oh, ya, opsi tersebut menggunakan tipe data Array untuk menampung semua pengaturan nya, sedangkan di dalam array nya ada semacam string $Options untuk nama opsi/pengaturan nya, sedangkan int $Value untuk nilainya, yang biasanya hanya bisa dimasukkan dengan angka. Mungkin, di bawah ini merupakan contoh penerapan $OpsiAlgoritma (beserta cara menggunakan fungsi password_hash() nya):

Bcrypt

Lihat contoh kode di bawah ini:

Contoh di atas merupakan cara menerapkan Opsi untuk penggunaan Algoritma nya, saya jelaskan sedikit tentang parameter yang ada disitu:

'cost' Рmerupakan parameter yang menentukan berapa banyak hash yang akan di lakukan. Misal seperti di contoh, jika di isi dengan 10, maka Bcrypt akan melakukan Hash sebanyak 2^10 (di baca 2 pangkat 10) kali atau sama dengan 1024 kali. Nilai defaultnya adalah 10.

Karena parameter yang tersedia hanya itu saja, maka ini mudah sekali untuk di implementasikan, hanya saja tidak sefleksibel Argon2i dalam menerapkan opsi nya.

Argon2i

Lihat contoh kode di bawah ini:

Contoh di atas merupakan cara menerapkan Opsi untuk penggunaan Algoritma nya, tidak seperti Bcrypt, Argon2i memiliki 3 parameter untuk setelan nya, apa saja itu? Silahkan baca di bawah ini:

'memory_cost' РMendefinisikan kebutuhan memori (RAM) untuk melakukan Hashing pada Kata Sandi, satuannya adalah KB (Kilo Byte), pada contoh di atas, saya menyetel nya dengan 1024*16, maka memory_cost nya sebesar 16 MB, karena 1 MB = 1024 KB dikalikan dengan angka 16.

Semakin besar maka semakin aman (atau meminimalisir keberhasilan untuk memecahkan kata sandi), tapi itu akan membutuhkan penggunaan memory (RAM) yang akan sangat banyak jika di set asal-asalan, apalagi saat pengguna mendaftarkan akunnya. Jadi, mohon untuk di set secukupnya. Oh, ya, parameter memory_cost bisa anda isikan juga dengan konstan PASSWORD_ARGON2_DEFAULT_MEMORY_COST agar menggunakan nilai bawaan, yakni 1 MB saja.

'time_cost' РIni saya juga bingung gimana ngejelasin nya, karena jujur, saya belum juga memahami parameter satu ini. Kalau yang saya pahami, ini mendefinisikan berapa kali Argon2i akan melakukan Hashing pada Password.

Semakin banyak maka semakin meminimalisir keberhasilan untuk memecahkan sebuah kata sandi, namun akan semakin mengorbankan waktu anda hanya karena melakukan Hashing secara berulang. Inilah kenapa di sebut “Time Cost”, karena Argon2i secara otomatis akan melakukan pengulangan selama beberapa kali dan itu akan memakan waktu. Parameter ini bisa anda isikan dengan konstan¬†PASSWORD_ARGON2_DEFAULT_TIME_COST¬†agar menggunakan nilai bawaan, yakni sebesar 2.

'threads' – Mendefinisikan berapa banyak thread yang ingin anda ‘korbankan’ untuk melakukan hashing kata sandi. Semakin banyak, maka semakin meminimalisir keberhasilan seseorang untuk memecahkan kata sandi, namun akan mengorbankan performa CPU secara keseluruhan. Sesuaikan saja dengan kemampuan CPU/Processor kamu. Parameter ini bisa di isi dengan konstan¬†PASSWORD_ARGON2_DEFAULT_THREADS¬†agar menggunakan nilai bawaan nya, yakni sebesar 2 thread saja.

Untuk lebih lanjut, silahkan baca salah satu halaman Wiki PHP. Parameter di atas tentu saja tidak bisa anda setel dengan nilai asal-asalan (sembarangan), anda harus mempertimbangkannya dengan matang sebelum menyetel nilai-nilai tersebut. Mengisinya terlalu banyak akan mengakibatkan skrip menjadi lambat untuk jalan dan sumber daya komputer pun harus di korbankan.

Nah, itulah opsi-opsi yang tersedia untuk penggunaan Algoritma tertentu, yang bisa anda atur sendiri. Oh, ya, sebenarnya $OpsiAlgoritma bisa anda ubah variabel nya, menjadi apapun itu, menjadi seperti $OpsiBcrypt atau $OpsiArgon2i atau apalah, selama anda mengerti tentang konsep variabel. Dan, anda juga bisa menghapus variabel $OpsiAlgoritma agar tidak ada opsi, lalu akan menggunakan opsi bawaan dari PHP. Menjadi seperti ini:

password_hash($teks, PASSWORD_ARGON2I);

Contoh Kode:

Btw, saya gunakan fungsi var_dump() untuk menampilkan output, dengan tujuan agar anda dapat melihat tipe data dan jumlah karakternya dengan jelas. Untuk sekedar menampilkan output dan untuk keperluan produksi, bisa anda gunakan echo, bahkan saya lebih menyarankannya daripada menggunakan var_dump() untuk output.

Karena var_dump() di gunakan untuk debugging atau sekedar melihat jumlah karakter dan tipe data di lokal.
Teks hash yang sebenarnya berada di dalam tanda kutip dua, silahkan pelajari fungsi var_dump() lebih lanjut

Yah, kira-kira seperti itu. Kamu sudah paham kan bagaimana caranya memanfaatkan fungsi ini. Di halaman selanjutnya akan di bahas tentang fungsi password_verify() yang di gunakan untuk memverifikasikan kata sandi.

Mungkin Anda juga menyukai