bcrypt и BLAKE2b: Новый алгоритм хеширования паролей в WordPress 6.8
В WordPress 6.8 пароли будут хешироваться через bcrypt, а не через phpass. Взлом таких хешей требует гораздо больше ресурсов.
Пароли приложений, ключи сброса пароля, ключи запросов персональных данных и режима восстановления перейдут на алгоритм BLAKE2b.
bcrypt — медленный, рассчитан на защиту паролей. В PHP используется через password_hash() / password_verify(). В WordPress 6.8 перед bcrypt добавлено предварительное SHA-384-хеширование, чтобы обойти лимит 72 байта и усилить стойкость паролей.
BLAKE2b — быстрый хеш для ключей и токенов, быстрее SHA-256 при сопоставимой надёжности.
Расширение libsodium в PHP уже содержит его реализацию, поэтому WordPress просто вызывает sodium_crypto_generichash() вместо своего старого PHP-скрипта. Получается и быстрее, и безопаснее.
Админам и пользователям ничего делать не нужно. Старые пароли и ключи продолжат работать как и раньше. Пользователи останутся авторизованными без смены пароля.
При первом входе или при смене пароля система автоматически пересчитает хеш с помощью bcrypt и сохранит его. Пароли приложений и ключи будут пересчитаны только при создании новых, старые останутся действительными до конца их срока.
Пароли для постов пока остаются на phpass. Их хеширование планируют улучшить позже.
Портативность
Хеши, создаваемые переносимым phpass, остаются портативными между различными сайтами, окружениями и серверами. Эта портативность не изменится с переходом на bcrypt и BLAKE2b, поэтому вы можете перемещать базу данных между серверами, обновлять PHP и WordPress, и хеши паролей будут работать как ожидалось.
Заметка про переносимый (portable) phpass
У phpass есть два режима:
- portable — чистый PHP-код, работает везде.
- native — полагается на crypt(), зависит от собранных алгоритмов на сервере.
WordPress использовал portable вариант, чтобы хеши гарантированно «жили» при переезде на другой сервер.
Новые bcrypt и BLAKE2b из password_hash() сразу кроссплатформенные «из коробки» (также можно переносить на разные сервера).
Предварительное хеширование SHA-384 у паролей
WordPress использует bcrypt для хеширования паролей, но у bcrypt есть ограничение — он учитывает только первые 72 байта пароля. Всё, что длиннее, просто обрезается и не участвует в хеше. Это может ослабить безопасность длинных паролей.
Чтобы избежать этого, WordPress сначала пропускает пароль через SHA-384 — это называется предварительное хеширование. В результате получается строка фиксированной длины, которая уже точно укладывается в 72 байта. Именно её потом и обрабатывает bcrypt.
Чтобы отличать такие «предварительно хешированные» bcrypt-хеши от обычных (например, созданных плагинами), WordPress добавляет префикс $wp$2y$ вместо обычного $2y$. Это помогает системе понять, как был получен хеш и правильно его проверить.
Нужно ли разработчикам что-то делать после обновления?
Расссмотрим варианты, когда и что нужно делать после обновления WP на версию 6.8:
-
Почти всегда — ничего.
Код, вызывающий wp_hash_password() и wp_check_password(), продолжит работать как раньше, изменений не требуется. -
Если код работает напрямую с хэшем.
Код, который предполагает наличие префикса$P$у хеша, придется изменить так, чтобы он либо вообще не анализировал префикс, либо поддерживал также и новые префиксы. Т.е. придется убрать жёсткую проверку$P$или добавьте поддержку новых префиксов:$wp$2y$— bcrypt + SHA-384 (новый дефолт).$2y$— «чистый» bcrypt (могут ставить плагины).$generic$— BLAKE2b для токенов.$argon2…— если сайт перешёл на Argon2.$P$— старый phpass.- 32-символьный MD5 — раритет.
-
Код проверяет пароли?
Такой код должен использовать следующие функции:- wp_check_password() — Для паролей пользователей.
- wp_verify_fast_hash() — Для токенов/ключей.
-
Плагин переопределяет WP функции wp_hash_password() и wp_check_password()?
Если переопределенные функции не реализуют другой алгоритм хеширования, их можно удалить, чтобы заработала новая реализация bcrypt. -
SSO, соц-логин, 2FA.
Альтернативные механизмы аутентификации, такие как SSO, социальный вход или одноразовый вход, скорее всего не затронуты. Реализации многофакторной аутентификации (MFA, 2FA) тоже вряд ли затронуты.Проверьте только, не лезет ли ваш код прямо в столбец
user_passили в «ключевые» мета-поля.
PHP Функции
Функции обработки паролей
Функции wp_hash_password() и wp_check_password() теперь используют встроенные функции PHP password_hash() и password_verify() с алгоритмом bcrypt и предварительным хешированием SHA-384.
Обе функции сохраняют поддержку глобального объекта $wp_hasher на случай, если он используется для реализации альтернативного механизма хеширования.
Функция wp_check_password() сохраняет поддержку паролей, хешированных с помощью phpass, поэтому существующие хеши не утратят актуальность.
Введена новая функция wp_password_needs_rehash() как обёртка над PHP функцией password_needs_rehash(). При необходимости плагин может изменить логику её работы через фильтр password_needs_rehash или может полностью переопределить фукнцию.
Функции быстрого хеширования
Появились новые функции-обёртки для алгоритма BLAKE2b:
-
wp_fast_hash() — Используется для быстрого хеширования строки.
- Нужен для секретов, у которых нет срока действия.
- Что делает: берёт входную строку, считает BLAKE2b-хеш, кодирует его в Base64 и добавляет префикс $generic$.
- Не нужно использовать для паролей: юзерские пароли хешируются медленным bcrypt, чтобы усложнить перебор.
- wp_verify_fast_hash() — Используется для проверки хеша, созданного через wp_fast_hash(). Также, обратно-совместим со старыми phpass-хешами.
Алгоритм Argon2
Argon2 — современный, «памяти-ёмкий» алгоритм для хеширования паролей: кроме CPU он требует заметный объём RAM, поэтому перебор хешей на GPU/ASIC становится дорогостоящим и медленным. Это повышает стойкость паролей по сравнению с bcrypt.
Серверы, поддерживающие Argon2, могут включить его использование в WP 6.8 одной строкой кода:
add_filter( 'wp_hash_password_algorithm', fn() => PASSWORD_ARGON2ID );
При необходимости следует сначала проверить поддержку argon2id через функцию password_algos().
К сожалению, нельзя полагаться на доступность Argon2 на всех серверах, потому что требуется наличие libargon2 и сборка PHP с поддержкой Argon2. Дефолтная php библиотека sodium_compat не предоставляет реализацию Argon2.
Полезная информация
-
Пароли пользователей хранятся в виде хеша в поле
wp_users.user_passбазы данных. -
Пароли приложений хранятся в виде хеша в сериализованном объекте JSON в таблице
wp_usermetaс ключом_application_passwords. -
Ключи сброса пароля пользователя хранятся в виде хеша в поле
wp_users.user_activation_keyбазы данных. -
Ключи запроса персональных данных хранятся в виде хеша в поле
wp_posts.post_passwordбазы данных. - Ключ режима восстановления хранится в виде хеша в опции
wp_options.recovery_keysбазы данных.
GitHub и Trac
Технические FAQ и детали реализации доступны в PR GitHub для этого изменения и в обсуждении на ticket Trac.
--
Источник: https://make.wordpress.org/core/2025/02/17/wordpress-6-8-will-use-bcrypt-for-password-hashing/