Hướng dẫn how php hash password mysql? - làm thế nào php băm mật khẩu mysql?

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();
      }
    }
  }
}

Mật khẩu băm MySQL có thể không?

MySQL sử dụng mật khẩu trong hai giai đoạn giao tiếp máy khách/máy chủ: Khi máy khách cố gắng kết nối với máy chủ, có một bước xác thực ban đầu trong đó máy khách phải trình bày mật khẩu có giá trị băm phù hợp với giá trị băm được lưu trong bảng người dùng Đối với tài khoản, khách hàng muốn sử dụng.

Mật khẩu PHP băm 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 băm hoạt động như thế nào?

PHP sẽ sử dụng thông tin trong băm được lưu trữ (tức là, thuật toán và các yếu tố chi phí) và chạy bản rõ được cung cấp thông qua hoạt động băm tương tự mà nó đã sử dụng trước đó.Nếu đầu ra của băm phù hợp với giá trị băm đã biết, hàm sẽ trả về đúng.. If the output of the hash matches the known hash value, the function returns true .

Mật khẩu băm PHP là bao lâu?

Hàm password_hash () tạo ra một hàm băm mật khẩu mới của chuỗi bằng một trong các thuật toán băm có sẵn.Tuy nhiên, nó trả về băm dài 60 ký tự, tuy nhiên, vì các thuật toán mới và mạnh hơn sẽ được thêm vào PHP, độ dài của băm có thể tăng.60 character long, however, as new and stronger algorithms will be added to PHP, the length of the hash may increase.