wp_check_password()WP 2.5.0

Сравнивает строки паролей: читабельный пароль (обычный) с кодированным паролем (в виде хэша). Нужна для проверки пароля пользователя.

Параметр $hash закодированный пароль (хранится в БД), а параметр $password - обычный текстовый пароль. Функция кодирует переданный текстовый пароль и сравнивает получившийся хэш с указанным, если они совпадают (кодированы по одному принципу) функция вернет true.

Поддерживает обратную совместимость со старой версией протокола аутентификации, который еще не использует библиотеку PHPass.

Pluggable функция — эту функцию можно заменить из плагина. Это значит, что она будет работать (подключается) только после подключения всех плагинов, а до этого момента функция еще не определена... Поэтому нельзя вызывать эту и зависящие от неё функции прямо из кода плагина. Их нужно вызывать через хук plugins_loaded или позднее, например хук init.

Замена функции (переопределение) — в must-use или обычном плагине можно создать функцию с таким же названием, тогда она заменит текущую функцию.

Работает на основе: PasswordHash::CheckPassword()
1 раз — 0.002451 сек (очень медленно) | 50000 раз — 124.36 сек (тормоз) | PHP 7.1.2, WP 4.7.5
Хуки из функции

Возвращает

true|false. true/false: false, если пароль не совпадает с хэшем.

Использование

wp_check_password( $password, $hash, $user_id );
$password(строка) (обязательный)
Пароль в виде обычного текста.
$hash(строка) (обязательный)
Закодированный пароль с которым нужно сравнить первый параметр.
$user_id(число)
ID пользователя, которому нужно пересохранить хэш пароля в соответствии с новым (последним) алгоритмом хэширования. Пересохранение произойдет только если указанный пароль пройдет проверку.
По умолчанию: ''

Примеры

0

#1 Проверим пароль пользователя

Допустим у нас есть пароль в виде обычного текста и нам нужно узнать является ли этот пароль паролем пользователя с ID 3:

$user = get_userdata( 3 );
if( $user ){
	$is_pass_ok = wp_check_password( 'my-super-pass', $user->data->user_pass );

	echo $is_pass_ok ? 'Пароль ОК' : 'Неправильный пароль';
}

Заметки

  • Global. PasswordHash. $wp_hasher phpass object. Used as a fallback for verifying passwords that were hashed with phpass.

Список изменений

С версии 2.5.0 Введена.
С версии 6.8.0 Passwords in WordPress are now hashed with bcrypt by default. A password that wasn't hashed with bcrypt will be checked with phpass.

Код wp_check_password() WP 6.9

function wp_check_password(
	#[\SensitiveParameter]
	$password,
	$hash,
	$user_id = ''
) {
	global $wp_hasher;

	if ( strlen( $hash ) <= 32 ) {
		// Check the hash using md5 regardless of the current hashing mechanism.
		$check = hash_equals( $hash, md5( $password ) );
	} elseif ( ! empty( $wp_hasher ) ) {
		// Check the password using the overridden hasher.
		$check = $wp_hasher->CheckPassword( $password, $hash );
	} elseif ( strlen( $password ) > 4096 ) {
		// Passwords longer than 4096 characters are not supported.
		$check = false;
	} elseif ( str_starts_with( $hash, '$wp' ) ) {
		// Check the password using the current prefixed hash.
		$password_to_verify = base64_encode( hash_hmac( 'sha384', $password, 'wp-sha384', true ) );
		$check              = password_verify( $password_to_verify, substr( $hash, 3 ) );
	} elseif ( str_starts_with( $hash, '$P$' ) ) {
		// Check the password using phpass.
		require_once ABSPATH . WPINC . '/class-phpass.php';
		$check = ( new PasswordHash( 8, true ) )->CheckPassword( $password, $hash );
	} else {
		// Check the password using compat support for any non-prefixed hash.
		$check = password_verify( $password, $hash );
	}

	/**
	 * Filters whether the plaintext password matches the hashed password.
	 *
	 * @since 2.5.0
	 * @since 6.8.0 Passwords are now hashed with bcrypt by default.
	 *              Old passwords may still be hashed with phpass or md5.
	 *
	 * @param bool       $check    Whether the passwords match.
	 * @param string     $password The plaintext password.
	 * @param string     $hash     The hashed password.
	 * @param string|int $user_id  Optional ID of a user associated with the password.
	 *                             Can be empty.
	 */
	return apply_filters( 'check_password', $check, $password, $hash, $user_id );
}