Правильный способ создания соленых хеш-паролей

Я новичок в хранении паролей в базах данных и из того, что я прочитал, я создал простой скрипт php ниже

<?php $salt = openssl_random_pseudo_bytes (16); $password = "test"; $hash = hash ("sha512" , $salt . $password); echo $hash; ?> 
  1. Правильно ли я делаю это?
  2. Должна ли соль храниться в базах данных в виде байтового типа данных?
  3. Должен ли конечный хэш быть сохранен в Stat datatype в базе данных?

Алгоритмы SHA * не подходят для хэш-паролей, потому что они слишком быстрые, и поэтому их можно слишком быстро перенаправить. Вместо этого следует использовать медленный алгоритм, такой как BCrypt или PBKDF2 с коэффициентом затрат, который контролирует необходимое время.

PHP поддерживает алгоритм BCrypt с новой функцией password_hash () . Также существует пакет совместимости для более ранних версий PHP.

 // Hash a new password for storing in the database. // The function automatically generates a cryptographically safe salt. $hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); // Check if the hash of the entered login password, matches the stored hash. // The salt and the cost factor will be extracted from $existingHashFromDb. $isPasswordCorrect = password_verify($password, $existingHashFromDb); 

Рекомендуется, чтобы вы не передавали свою соль, вместо этого позвольте функции создать криптографически безопасную соль из случайного источника операционной системы.

Соль будет включена в итоговое значение хеша, поэтому вам не нужно хранить его отдельно. Просто создайте 60-значное строковое поле в своей базе данных и сохраните хэш-значение. Функция password_verify() будет извлекать использованную соль из сохраненного значения хэш-функции. Для получения дополнительной информации вы можете ознакомиться с моим руководством по хранению паролей .

Если вы работаете (PHP 5 >= 5.5.0) вы можете воспользоваться встроенной функцией хэширования паролей php.

Простое использование:

 $options = [ 'cost' => 11, 'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), // or your own salt here ]; $pass_hash = password_hash("helloworld", PASSWORD_BCRYPT, $options); if (password_verify('helloworld', $pass_hash)) { echo 'Password is valid!'; } else { echo 'Invalid password.'; } 

Обычно я хранил соль с хешированным паролем. У меня есть свой собственный формат, чтобы распознать соль в виде хешированного пароля. например, хешированный пароль: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824, а соль – aaabbb. Я добавляю соль к хешированному паролю, например, 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824aaabbb. Поэтому я могу узнать, что последнее 6 слово – соль для этого хешированного пароля. Даже дБ взломали, они все еще не знали соли и настоящий пароль.