Hướng dẫn how to login with hashed password php - cách đăng nhập bằng mật khẩu băm php

Làm thế nào để tăng bảo mật băm

Hash được tạo bởi password_hash () rất an toàn.

Nhưng bạn có thể làm cho nó thậm chí còn mạnh mẽ hơn với hai kỹ thuật đơn giản:

  1. Tăng chi phí BCRYPT.Bcrypt cost.
  2. Tự động cập nhật thuật toán băm.hashing algorithm.

Chi phí bcrypt

BCRYPT là thuật toán băm mặc định hiện tại được sử dụng bởi password_hash ().default hashing algorithm used by password_hash().

Thuật toán này có một tham số tùy chọn có tên là chi phí. Giá trị chi phí mặc định là 10.“cost”. The default cost value is 10.

Bằng cách tăng chi phí, bạn có thể làm cho băm trở nên khó khăn hơn để tính toán. & Nbsp; chi phí càng cao, thời gian cần thiết để tạo hàm băm càng dài.

Một chi phí cao hơn làm cho khó khăn hơn để phá vỡ hàm băm. Tuy nhiên, nó cũng làm cho việc tạo băm và kiểm tra lâu hơn, quá.

Vì vậy, bạn muốn tìm thấy sự thỏa hiệp giữa tải bảo mật và tải máy chủ.

Đây là cách bạn có thể đặt giá trị chi phí tùy chỉnh cho 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);

Nhưng bạn nên đặt giá trị chi phí nào?

Một thỏa hiệp tốt là một giá trị chi phí cho phép máy chủ của bạn tạo băm trong khoảng 100ms.

Dưới đây là một bài kiểm tra đơn giản để tìm giá trị này:


/* 100 ms. */
$time = 0.1;

/* Initial cost. */
$cost = 10;

/* Loop until the time required is more than 100ms. */
do
{
  /* Increase the cost. */
  $cost++;
  
  /* Check how much time we need to create the hash. */
  $start = microtime(true);
  password_hash('test', PASSWORD_BCRYPT, ['cost' => $cost]);
  $end = microtime(true);
}
while (($end - $start) < $time);

echo 'Cost found: ' . $cost;

Khi bạn đã tìm thấy chi phí của mình, bạn có thể sử dụng nó mỗi khi bạn thực hiện password_hash () như trong ví dụ trước.

Giữ cho băm của bạn được cập nhật với password_needs_rehash ()

Để hiểu bước này, hãy để Lôi xem cách & nbsp; password_hash () & nbsp; hoạt động.

password_hash () có ba đối số:

  1. Mật khẩu bạn cần băm
  2. Thuật toán băm bạn muốn sử dụnghashing algorithm you want to use
  3. Một loạt các tùy chọn để chuyển đến thuật toán bămoptions to pass to the hashing algorithm

PHP hỗ trợ các thuật toán băm khác nhau, nhưng bạn thường muốn sử dụng một thuật toán mặc định.

Bạn có thể chọn thuật toán mặc định bằng cách sử dụng hằng số password_default, như bạn đã thấy trong các ví dụ trước.

Kể từ tháng 6 năm 2020, thuật toán mặc định là bcrypt.

Tuy nhiên, PHP có thể thay đổi thuật toán mặc định trong tương lai, nếu một thuật toán tốt hơn và an toàn hơn được thực hiện.

Khi điều đó xảy ra, & nbsp; password_default & nbsp; hằng số sẽ trỏ đến thuật toán mới. Vì vậy, tất cả các băm mới sẽ được tạo bằng thuật toán mới.

Nhưng điều gì sẽ xảy ra nếu bạn muốn lấy tất cả các băm cũ của bạn, được làm bằng thuật toán trước đó và tự động tạo chúng lại với cái mới?

Đây là nơi password_needs_rehash () phát huy tác dụng.password_needs_rehash() comes into play.

Hàm này kiểm tra xem một hàm băm đã được tạo với một thuật toán và tham số nhất định.

Ví dụ:


/* Password. */
$password = 'my secret password';

/* Set the "cost" parameter to 10. */
$options = ['cost' => 10];

/* Create the hash. */
$hash = password_hash($password, PASSWORD_DEFAULT, $options);

/* Now, change the cost. */
$options['cost'] = 12;

/* Check if the hash needs to be created again. */
if (password_needs_rehash($hash, PASSWORD_DEFAULT, $options))
{
  echo 'You need to rehash the password.';
}

Nếu thuật toán băm mặc định hiện tại khác với thuật toán được sử dụng để tạo băm, & nbsp; password_needs_rehash () trả về đúng.

password_needs_rehash () & nbsp; cũng kiểm tra xem tham số tùy chọn & nbsp; có khác không.options parameter is different.

Điều này rất tiện dụng nếu bạn muốn cập nhật băm của mình sau khi bạn thay đổi một tham số như & nbsp; bcrypt chi phí.Bcrypt cost.

Ví dụ này cho thấy cách bạn có thể tự động kiểm tra mật khẩu băm và cập nhật nếu cần, khi người dùng từ xa đăng nhập:


/* Include the database connection script. */
include 'pdo.php';

/* Set the "cost" parameter to 12. */
$options = ['cost' => 12];

/* 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;
	
	/* Check if the hash needs to be created again. */
    if (password_needs_rehash($row['account_passwd'], PASSWORD_DEFAULT, $options))
    {
      $hash = password_hash($password, PASSWORD_DEFAULT, $options);
      
      /* Update the password hash on the database. */
      $query = 'UPDATE accounts SET account_passwd = :passwd WHERE account_id = :id';
      $values = [':passwd' => $hash, ':id' => $row['account_id']];
      
      try
      {
        $res = $pdo->prepare($query);
        $res->execute($values);
      }
      catch (PDOException $e)
      {
        /* Query error. */
        echo 'Query error.';
        die();
      }
    }
  }
}

Có thể lấy mật khẩu từ mật khẩu băm không?

Băm là một chuyển đổi một chiều. Bạn không thể hủy dữ liệu băm và nhận văn bản. Nếu bạn đang sử dụng nhận dạng ASP.NET, nó cũng sử dụng phương thức này để so sánh mật khẩu với mật khẩu băm.You cannot un-hash hashed data and get the text. If you are using Asp.net Identity, it also using this method to compare the password with the hashed password.

Làm thế nào có thể nhận được mật khẩu băm từ cơ sở dữ liệu trong PHP?

Những gì bạn cần làm là lấy truy vấn cơ sở dữ liệu cho bản ghi qua email sau đó so sánh băm mật khẩu được trả về từ cơ sở dữ liệu với mật khẩu đầu vào bằng password_verify (). Thực hiện theo các bước đơn giản để xác minh người dùng. 1. Chạy truy vấn cơ sở dữ liệu để lấy người dùng qua email để lấy mật khẩu băm.get the query the database for the record by email then compare the password hash returned from the database with the input password using password_verify(). Follow the simple steps to verify the user. 1. Run the database query to get user by email to get the hashed password.

Mật khẩu băm trong PHP là gì?

password_hash () tạo một hàm băm mật khẩu mới bằng thuật toán băm một chiều mạnh mẽ.Các thuật toán sau đây hiện đang được hỗ trợ: password_default - Sử dụng thuật toán BCRYPT (mặc định là Php 5.5. 0).Lưu ý rằng hằng số này được thiết kế để thay đổi theo thời gian vì các thuật toán mới và mạnh hơn được thêm vào PHP.creates a new password hash using a strong one-way hashing algorithm. The following algorithms are currently supported: PASSWORD_DEFAULT - Use the bcrypt algorithm (default as of PHP 5.5. 0). Note that this constant is designed to change over time as new and stronger algorithms are added to PHP.

Php password_hash có an toàn không?

Kết quả băm từ password_hash () là an toàn vì: Nó sử dụng thuật toán băm mạnh mẽ.Nó thêm một muối ngẫu nhiên để ngăn chặn các bảng cầu vồng và các cuộc tấn công từ điển. because: It uses a strong hashing algorithm. It adds a random salt to prevent rainbow tables and dictionary attacks.