Apakah php memiliki fungsi hash?

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
Dan seterusnya. Validasi di luar cakupan tutorial ini, tetapi ingat bahwa Anda selalu perlu memvalidasi variabel masukan. Anda dapat merujuk ke Tutorial Login dan Otentikasi saya untuk detail dan contoh lebih lanjut. Jika Anda ingin mempelajari lebih lanjut tentang keamanan PHP, lihat kursus Keamanan PHP saya

 

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

  1. Meningkatkan biaya Bcrypt
  2. 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

  1. Kata sandi yang perlu Anda hash
  2. Algoritma hashing yang ingin Anda gunakan
  3. 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?

Fungsi hash() mengembalikan nilai hash untuk data yang diberikan berdasarkan algoritme seperti (md5, sha256) . Nilai kembalian adalah string dengan hexits (nilai heksadesimal).

Bagaimana cara menggunakan hashing di PHP?

Lihat Juga ¶ .
hash_file() - Hasilkan nilai hash menggunakan konten file yang diberikan
hash_hmac() - Menghasilkan nilai hash yang dikunci menggunakan metode HMAC
hash_init() - Menginisialisasi konteks hashing tambahan
md5() - Menghitung hash md5 dari sebuah string
sha1() - Menghitung hash sha1 dari sebuah string

Bagaimana cara membuat kode hash di PHP?

Fungsi PHP sha1() .
Hitung hash SHA-1 dari string "Hello". $str = "Halo"; .
Print the result of sha1(): $str = "Hello"; echo "The string: ". $str."
"; .. .
Cetak hasil sha1() lalu uji. $str = "Halo";

Fungsi hashing mana yang terbaik di PHP?

Dalam PHP, terdapat berbagai algoritma kriptografi yang umum digunakan seperti md5, crypt, sha1, dan bcrypt. Dan yang paling umum digunakan saat ini adalah metode hashing bcrypt .