Как определить, поддерживает ли функции PHP password_hash опцию «поток»?

#php

Вопрос:

Для функции PHP password_hash в руководстве говорится, что передача количества потоков «Доступна только в том случае, если PHP использует libargon2, а не с реализацией libsodium»..

Будет выдана ошибка, если опция потока установлена, когда она недоступна.

Что касается кода библиотеки, как я могу определить во время выполнения, доступен ли параметр потока?

Комментарии:

1. Вы получаете сообщение об ошибке, когда указываете threads настройку, но ее нельзя использовать?

2. @JaredFarrish Расширения нет; функция является частью ядра PHP .

3. @Olivier Удален, если это не загруженное расширение (потому что это PHP, построенный с библиотекой C, которая не зарегистрирована как расширение).

Ответ №1:

PASSWORD_ARGON2_DEFAULT_THREADS Константа определяется только при использовании libargon2:

ПАРОЛЬ_ARGON2_DEFAULT_ПОТОКИ По умолчанию определяет количество потоков, которые будет использовать Argon2lib. Недоступно с реализацией libsodium.

Таким образом, вы можете просто проверить, существует ли константа:

 if(defined('PASSWORD_ARGON2_DEFAULT_THREADS'))
{
   // Set the number of threads
   ...
}
 

Ответ №2:

Проверьте, загружено ли расширение, и удалите опцию, если нет.

 function hash_password(
    string $password,
    string | int | null $algo,
    array $options = []
): string {
    if (!extension_loaded('libargon2') amp;amp; isset($options['threads'])) {
        unset($options['threads']);
    }

    return password_hash($password, $algo, $options);
}
 

Комментарии:

1. Дайте мне знать , если загруженное имя расширения не libargon2 указано, я не знаю этого наверняка.

2. Расширения libargon2 не существует. Эта функция является частью ядра PHP .

3. @Оливье, что это значит? Однако, чтобы включить хэширование паролей Argon2, PHP должен быть построен с поддержкой libargon2 с использованием опции настройки —with-password-argon2[=DIR]. Похоже, загружается что-то еще, хотя password_hash() будет работать и без этого.

4. Если PHP построен без libargon2, список доступных алгоритмов не будет включать argon2i и argon2id .

5. В чем заключается аргумент? Это extension_loaded('libargon2') не определит libargon2 , загружено ли оно?