Как я могу обновить пароль в WordPress через PHP, если у меня есть новый хэш пароля MD5, а не пароль с открытым текстом?

#php #wordpress #change-password

#php #wordpress #md5 #изменить пароль

Вопрос:

Я должен обработать изменения пароля из удаленной системы в WordPress, где внешняя система вызывает конечную точку, доступную с помощью нашего плагина WP, и предоставляет только идентификатор пользователя и хэшированный пароль MD5, а не пароль с открытым текстом. Мне нужно заменить хэш пароля для этого пользователя в WP на обновленный хэш, чтобы поддерживать синхронизацию между двумя платформами.

Все текущие функции WP, похоже, принимают только пароль с открытым текстом, который они хэшируют на пути в базу данных, например:

 wp_set_password( string $password, int $user_id )
 

Я пытался установить пароль через SQL в плагине, но это не работает, и я не уверен, почему.

 global $wpdb;

$wpdb->query( "UPDATE $wpdb->users SET user_pass = '$user_pass', user_activation_key = '' WHERE user_login = '$user_login'" );
 

Где в приведенном выше SQL $user_pass содержится хэш пароля, полученный из внешней системы, а не пароль с открытым текстом.

Есть ли чистый способ выполнить это, которого мне не хватает, или что-то в синтаксисе SQL, приведенном выше, неверно?

Обновить:

Я могу заполнить поле user_pass в базе данных для пользователя предоставленным хэшем MD5 и могу использовать механизм WP, где он будет обновляться до PHPass при следующем входе пользователя в систему, но я сталкиваюсь с действительно странным поведением, при котором это работает только с очень ограниченными паролями и их результирующим хэшем MD5.

Если хэшированный пароль состоит из 16 символов и все в верхнем регистре, установка хэша в базу данных позволяет пользователю войти в систему, а пароль обновляется до PHPass в базе данных. Аналогично, если пароль «wordpress», сгенерированный хэш может быть загружен в базу данных, и пользователь может войти в систему. Если пароль является каким-либо другим, он завершается ошибкой, либо экран входа обновляется без предупреждения, либо отображается ошибка «неверный вход».

Для меня это не имеет смысла. Есть ли какое-то ограничение, о котором я здесь спотыкаюсь? Параметр конфигурации, который я могу настроить, чтобы заставить это работать так, как я ожидаю? Это ошибка?

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

1. WordPress не использует только прямой MD5 для паролей. Вместо этого он использует 256 раундов паролей с солью и сохраняет их в «переносимом формате» . Если у вас есть только необработанная строка MD5, это не сработает. Однако, вы, вероятно, могли бы просто использовать wp_set_password для установки пароля хэш существующего хэша, а затем переопределить wp_check_password и добавить туда раунд MD5.

2. @ChrisHaas Я обнаружил, что если я создаю хэш MD5 пароля, который состоит из 16 символов и все в верхнем регистре, добавляю этот хэш непосредственно в базу данных WordPress, затем я могу войти в систему через форму входа WP, и пароль обновляется до формата PHPass для будущих входов. Если я создаю хэш MD5 для пароля, который длиннее, все строчные буквы (кроме, как ни странно, «wordpress») содержат цифры или специальные символы, это вообще не работает. Есть идеи, что может быть ограничивающим фактором?

3. К сожалению, нет, я этого не знаю. Я знаю, что основная wp_check_password функция ищет хэши паролей длиной не более 32 символов и предполагает, что это устаревшие пароли MD5, и «обновляет» их. Но я действительно не знаю, почему корпус или символы будут иметь значение. Возможно ли, что все, что генерирует хэши из другой системы, имеет ошибку? Код для этого очень простой , и я не могу придумать ничего, что могло бы вызвать то, что вы видите на стороне WordPress.

4. Спасибо — я использую онлайн-генератор хэшей MD5 и подтвердил хэш вторым для тестирования на случай, если удаленная система делает что-то странное со своей схемой генерации хэша. Для меня это вообще не имеет никакого смысла, если только короткие или все заглавные пароли не содержат коротких хэшей, а остальные генерируют хэши длиной более 32 символов — это то, что я могу подтвердить, по крайней мере.