Hướng dẫn php store password_hash in mysql - php store password_hash trong mysql

Tôi đã tạo tên người dùng và mật khẩu mặc định trong bảng MySQL với lệnh này.

 insert into users (email, password) values('admin', md5('1234'));

và sau đó cố gắng xác minh với PHP;

password_verify($_POST['password'], $results['password'])

Nhưng, nó chưa được xác minh .. nhưng, nếu tôi tạo tên người dùng và mật khẩu với

$stmt -> bindParam(':password', password_hash($_POST['password'], 
PASSWORD_BCRYPT));

nó có thể được xác minh ..

Câu hỏi của tôi:

Tôi muốn tạo tên người dùng và mật khẩu mặc định bằng lệnh mysql và muốn trang web (PHP) xác minh nó bằng đầu vào của người dùng.

Để làm điều này, tôi cần sử dụng chức năng MySQL nào cho mã hóa mật khẩu? md5 () dường như không bằng password_hash trong PHP ..md5() seems not to be equal to password_hash in php..

cảm ơn rất nhiều

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