Как использовать переменную во втором аргументе password_hash? - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь хэшировать пароль, используя password_hash(), передавая имя алгоритма хеширования, используя строку:

$password = '121@121';
$hash_method = 'PASSWORD_BCRYPT';
$password_encrypted = password_hash($password, $hash_method);

Однако это приводит к предупреждению:

Предупреждение: password_hash () ожидает, что параметр 2 будет целочисленным, задана строка

Если я хочу динамически определить алгоритм, например, из переменной конфигурации, установленной в базе данных, как я могу передать строкузначение до password_hash()?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2019

Вы можете использовать функцию constant().

password_hash($password, constant($hash_method));

constant() принимает в качестве аргумента строку и возвращает значение константы с тем же именем. Его следует использовать вместе с defined(), чтобы убедиться, что такая константа существует, и вы не получите предупреждение.

Например:

$algorithm_value = defined($hash_method) ? constant($hash_method) : PASSWORD_DEFAULT;
$password_encrypted = password_hash($password, $algorithm_value);
2 голосов
/ 09 ноября 2019

Это происходит потому, что PASSWORD_BCRYPT является константой , а не строкой. PASSWORD_BCRYPT является удобной для человека версией числового значения - оно избавляет от необходимости запоминать миллиард чисел и их соответствующие значения.

Отредактированная информация

Дхарман обнаружил this - что указывает на то, что в PHP7.4 постоянные значения для типов шифрования больше не будут числовыми значениями.

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

PASSWORD_DEFAULT was int 1; now is NULL
PASSWORD_BCRYPT was int 1; now is string '2y'
PASSWORD_ARGON2I was int 2; now is string 'argon2i'
PASSWORD_ARGON2ID was int 3; now is string 'argon2id'

Просто удалите кавычки, и все готово:

<code><?php
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(-1);

    $password = '121@121';
    $hash_method = PASSWORD_BCRYPT;
    $password_encrypted = password_hash($password, $hash_method);

    echo '<pre>'. print_r($password_encrypted, 1) .'
';

Если вы получаете PASSWORD_BCRYPT из $_POST или из базы данных, вы можете использовать функцию constant():

<code><?php
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(-1);

    $password = '121@121';
    $hash_method = 'PASSWORD_BCRYPT';
    $password_encrypted = password_hash($password, constant($hash_method));

    echo '<pre>'. print_r($password_encrypted, 1) .'
';
0 голосов
/ 09 ноября 2019

Вы должны установить второй параметр $algo из password_hash с константой алгоритма пароля PASSWORD_BCRYPT, а не строкой 'PASSWORD_BCRYPT'

/**
 * (PHP 5 &gt;= 5.5.0, PHP 5)<br/>
 *
 * Creates a password hash.
 * @link http://www.php.net/manual/en/function.password-hash.php
 * @param string $password The user's password.
 * @param int $algo A <a href="http://www.php.net/manual/en/password.constants.php" class="link">password algorithm constant</a>  denoting the algorithm to use when hashing the password.
 * @param array $options [optional] <p> An associative array containing options. See the <a href="http://www.php.net/manual/en/password.constants.php" class="link">password algorithm constants</a> for documentation on the supported options for each algorithm.
 * If omitted, a random salt will be created and the default cost will be used.
 * <b>Warning<b>
 * <p>
 * The salt option has been deprecated as of PHP 7.0.0. It is now
 * preferred to simply use the salt that is generated by default.
 * </p>
 * @return string|bool Returns the hashed password, or FALSE on failure.
 * @since 5.5.0
 */
function password_hash ($password, $algo, $options = null) {}
...