Apa metode php yang kita gunakan untuk hash kata sandi?

Setiap aplikasi web yang memungkinkan pengguna mengautentikasi perlu memastikan kredensial pengguna mereka mendapatkan perlindungan terbaik. Secara konvensional, ini dilakukan dengan hanya menyimpan hash kata sandi daripada kata sandi itu sendiri. Untungnya, hashing kata sandi di PHP aman, aman, dan sangat mudah diterapkan

Bulan lalu kami berbicara panjang lebar tentang berbagai cara untuk membuat hash dari string asal yang sama menjadi unik. Saat dua pengguna memanfaatkan kata sandi autentikasi yang sama, Anda tidak ingin hal itu terlihat jelas di penyimpanan data Anda. Pada saat yang sama, sebaiknya buat cadangan beberapa langkah dan diskusikan hashing kata sandi dan algoritme yang membuatnya aman

Benar-Benar Acak

Konsep paling mendasar dalam kriptografi yang perlu dipahami semua orang agar hashing masuk akal adalah keacakan. Dalam komputasi, tidak ada arti sebenarnya dari keacakan. Komputer adalah mesin yang sepenuhnya deterministik yang dibuat khusus untuk menghasilkan keluaran tertentu dengan masukan tertentu. Sifat yang dapat diprediksi inilah yang membuat komputer dapat diandalkan, tetapi juga yang membuat hal-hal tertentu menjadi sulit

Keamanan di balik kriptografi bergantung pada keacakan. Algoritme "aman secara kriptografis" adalah algoritme yang membuat keluarannya benar-benar tidak dapat dibedakan dari derau acak. Ini sulit dicapai dalam praktiknya, tetapi ada ekstensi dan metode praktis yang tersedia untuk pengembang PHP yang menangani masalah untuk Anda

Terutama, pengembang PHP harus menggunakan fungsi password_hash() untuk menghasilkan kata sandi hash. Demikian pula, Anda harus menggunakan fungsi password_verify()_ untuk memverifikasi hash dari setiap kata sandi yang Anda buat. Keduanya diimplementasikan dengan aman dalam PHP dan mengandalkan sumber pseudo-randomness yang aman secara kriptografis yang disediakan oleh sistem operasi yang mendasarinya

Banyak tutorial lama mereferensikan fungsi mt_rand()_ sebagai generator nomor pseudorandom untuk digunakan dalam PHP. Itu memang menghasilkan nomor pseudorandom, tetapi fungsinya tidak aman secara kriptografis. Jika Anda mengetahui seed yang digunakan untuk memulai deret, Anda dapat dengan mudah memprediksi setiap angka yang dihasilkan oleh fungsi tersebut. Ini adalah pengingat bahwa Anda hanya boleh mengandalkan fungsi yang aman secara kriptografis untuk operasi keamanan di PHP

Faktor Waktu dan Memori

Pada saat penulisan ini, tiga algoritme tersedia untuk digunakan dengan password_hash(). Algoritme default hari ini adalah CRYPT_BLOWFISH_ dan dapat digunakan dengan meneruskan PASSWORD_DEFAULT atau

$cost = 8;

do {
  $cost += 1;
  $start = microtime(true);
  password_hash('test', PASSWORD_BCRYPT,
                ['cost' => $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);
0 sebagai bendera ke metode

$hash = password_hash($password, PASSWORD_DEFAULT);
_

Alternatifnya, jika PHP dikompilasi dengan dukungan Argon2, Anda dapat meneruskan

$cost = 8;

do {
  $cost += 1;
  $start = microtime(true);
  password_hash('test', PASSWORD_BCRYPT,
                ['cost' => $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);
1 atau
$cost = 8;

do {
  $cost += 1;
  $start = microtime(true);
  password_hash('test', PASSWORD_BCRYPT,
                ['cost' => $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);
2 untuk memanfaatkan algoritme Argon2i atau Argon2id, masing-masing. Setiap pilihan algoritme menawarkan keuntungan berbeda bagi Anda untuk keamanan, tetapi setiap algoritme akan memiliki pengidentifikasi yang dikodekan ke dalam output hash dari fungsi tersebut. Bahkan jika algoritme default dalam PHP berubah di masa mendatang saat Anda menggunakan PASSWORD_DEFAULT di masa lalu, sistem dapat mendeteksi penggunaan bcrypt dan memverifikasi hash dengan benar. Fungsi
$cost = 8;

do {
  $cost += 1;
  $start = microtime(true);
  password_hash('test', PASSWORD_BCRYPT,
                ['cost' => $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);
4 juga dapat menunjukkan bahwa Anda harus memutakhirkan dan melakukan hashing ulang kata sandi jika Anda mengubah algoritme hashing di masa mendatang

Pengembang juga dapat menyetel setiap algoritme ini secara tepat untuk menghabiskan banyak waktu dan menggunakan sumber daya sistem sebanyak yang diperlukan untuk membuat hashing relatif lambat di server. Keuntungan dari hash yang lambat adalah, jika database Anda pernah dikompromikan dan bocor, penyerang membutuhkan waktu yang sangat lama untuk menebak hash tertentu dengan kekerasan.

Hash yang lambat tidak menjadi masalah untuk autentikasi pengguna sehari-hari. Jika kata sandi memerlukan waktu satu detik untuk di-hash, maka diperlukan satu detik bagi pengguna untuk mengautentikasi dengan kata sandi yang benar. Dengan asumsi penyerang mencoba menebak kata sandi dengan kekerasan, mereka hanya dapat menebak satu kata sandi per detik. Diberikan enam karakter alfanumerik, ada 56.800.235.584 kemungkinan kata sandi. Sekali lagi, menebak satu kata sandi per detik, akan memakan waktu lebih dari 1.800 tahun untuk mencoba semua kemungkinan kombinasi kata sandi

Algoritme

$cost = 8;

do {
  $cost += 1;
  $start = microtime(true);
  password_hash('test', PASSWORD_BCRYPT,
                ['cost' => $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);
0 mendukung faktor biaya—menggunakan biaya 10 secara default. Semakin tinggi biayanya, semakin sulit mesin Anda bekerja untuk menghasilkan hash. Mengingat kami ingin menargetkan satu hash per detik, kami dapat menghitung faktor biaya yang sesuai untuk server tertentu menggunakan rutin di Listing 1

Daftar 1

$cost = 8;

do {
  $cost += 1;
  $start = microtime(true);
  password_hash('test', PASSWORD_BCRYPT,
                ['cost' => $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);

Di mesin saya, faktor biaya yang sesuai di sini adalah 15. Biaya ini jauh lebih tinggi daripada standar 10

Keluarga hash Argon2 menggunakan pengaturan serupa tetapi memungkinkan menentukan biaya waktu dan biaya memori. Untuk contoh ini, kami hanya akan menyesuaikan biaya waktu, mulai dari default

$cost = 8;

do {
  $cost += 1;
  $start = microtime(true);
  password_hash('test', PASSWORD_BCRYPT,
                ['cost' => $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);
6 (Listing 2)

Daftar 2

 $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);
_

Misalnya, mesin saya menyarankan biaya waktu 17, yang secara signifikan lebih tinggi daripada default hard-coded. Untuk mengontrol kecepatan hashing Anda, tim Anda harus menguji kecepatan hashing sebenarnya dari perangkat keras server Anda dan menyetel prosesnya sesuai dengan itu

Hash Argon2id menggunakan opsi dan pengaturan yang sama dengan Argon2i; . Di mesin saya, keduanya menyarankan faktor waktu yang serupa

Saat pengguna Anda mencoba mengautentikasi, kami perlu melakukan hash ulang kata sandi mentah yang disediakan dan memverifikasi hash tersebut ke keluaran yang sama yang telah kami simpan di tempat lain di basis data kami. Meskipun mungkin tergoda untuk melakukan hashing dan perbandingan string secara langsung, pengembang tidak boleh mengimplementasikan operasi kriptografi mereka sendiri

Sebagai gantinya, kita dapat memanfaatkan password_verify()_, meneruskan baik kata sandi teks biasa yang diberikan pengguna maupun hash kata sandi tersimpan yang ingin kita bandingkan. Secara internal, fungsi ini akan melakukan hash ulang kata sandi teks biasa menggunakan algoritme dan faktor biaya yang sama, lalu membandingkannya dengan aman dengan hash yang kita ketahui

Perbandingan string yang aman adalah topik terpisah yang akan kita bahas nanti. Untuk saat ini, ketahuilah bahwa hanya membandingkan dua string dengan operator kesetaraan sederhana (

$cost = 8;

do {
  $cost += 1;
  $start = microtime(true);
  password_hash('test', PASSWORD_BCRYPT,
                ['cost' => $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);
8) tidak cukup untuk operasi yang aman secara kriptografis dan percayalah bahwa fungsi inti yang disediakan oleh PHP membuat keputusan yang cerdas dan aman

$valid = password_verify($password, $stored_hash);
if (!$valid) {
  throw new UnauthorizedException('Invalid password!');
}

PHP akan menggunakan informasi dalam hash yang disimpan (mis. e. , algoritma dan faktor biaya) dan jalankan plaintext yang disediakan melalui operasi hashing yang sama seperti yang digunakan sebelumnya. Jika hasil hash cocok dengan nilai hash yang diketahui, fungsi mengembalikan

$cost = 8;

do {
  $cost += 1;
  $start = microtime(true);
  password_hash('test', PASSWORD_BCRYPT,
                ['cost' => $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);
9. Jika tidak, ia mengembalikan
 $cost]);
  $end = microtime(true);
} while (($end - $start) < 1);

echo sprintf('Time cost => %d', $cost);
_0, dan diserahkan kepada pengembang untuk menangani pengembalian negatif ini

Kesimpulannya

Hashing itu sendiri rumit. Kami tidak merinci algoritme yang digunakan dalam artikel ini karena diskusi tersebut akan sangat panjang dan memerlukan pemahaman mendalam tentang matematika yang rumit. Untungnya, PHP membuat kata sandi hashing sangat mudah

Jangan habiskan waktu untuk mencoba menulis algoritme hashing Anda sendiri. Jangan mencoba menciptakan perlindungan kata sandi atau protokol verifikasi Anda sendiri. Jangan percaya tutorial online yang menggunakan fungsi hashing lainnya untuk kata sandi. Manfaatkan fungsi hashing dan verifikasi kata sandi bawaan yang disediakan oleh PHP. Ini efisien dan dapat disetel untuk memberikan perlindungan maksimal kepada pengguna akhir Anda

Biografi

Eric adalah pengembang web berpengalaman yang berpengalaman dengan berbagai bahasa dan platform. Dia telah bekerja dengan PHP selama lebih dari satu dekade dan memfokuskan waktunya untuk membantu pengembang memulai dan mempelajari keterampilan baru dengan teknologi pilihan mereka. Anda dapat menghubunginya langsung melalui Twitter. @EricMann

Bagaimana cara hash kata sandi di PHP?

password_hash .
PASSWORD_DEFAULT - Gunakan algoritma bcrypt (default pada PHP 5. 5. 0). .
PASSWORD_BCRYPT - Gunakan algoritma CRYPT_BLOWFISH untuk membuat hash. .
PASSWORD_ARGON2I - Gunakan algoritme hashing Argon2i untuk membuat hash. .
PASSWORD_ARGON2ID - Gunakan algoritme hashing Argon2id untuk membuat hash

Algoritma apa yang digunakan PHP password_hash?

Bcrypt adalah algoritme hashing default saat ini yang digunakan oleh password_hash(). Algoritma ini mengambil parameter opsi bernama “biaya”. Nilai biaya default adalah 10.

Metode hashing mana yang digunakan untuk kata sandi?

Algoritme hashing yang umum digunakan mencakup Algoritme Intisari Pesan (MDx), seperti MD5, dan Algoritme Hash Aman (SHA), seperti SHA-1 dan keluarga SHA-2 yang . .

Apa gunanya hashing di PHP?

Fungsi hashing dalam PHP adalah metode khusus yang telah ditentukan sebelumnya dan digunakan untuk menunjukkan string dalam bentuk nilai tertentu yang diukur dari karakter string. It is popular for its application as an encryption algorithm and as an index value representation for items in the database.