
🔐 Какой тип хеша использует WordPress
Пароль от админки, последнее, что стоит между хакером и полным контролем над сайтом. Слабый пароль или устаревший механизм хранения превращают дорогой хостинг и платный файрвол в декорации.
За двадцать лет WordPress прошел путь от MD5 до промышленного bcrypt. С версии 6.8 хеширование паролей стало современным прямо из коробки, без плагинов и костылей. Но понимать, что именно происходит с вашим паролем после нажатия «Войти», стоит каждому владельцу сайта.
Ниже, вся цепочка: от ввода пароля в форму логина до хеш-строки в базе данных. С кодом, фильтрами и конкретными настройками для тех, кто хочет больше, чем дает ядро.
💡 Быстрый обзор:
- WordPress 6.8 и новее хеширует пароли алгоритмом bcrypt, тем же стандартом, что используют банки и правительственные системы
- Старые хеши (MD5, phpass) автоматически обновляются до bcrypt при следующем входе пользователя, миграция прозрачна и не требует ручных действий
- Фильтр
wp_hash_password_algorithmпозволяет переключиться на Argon2 одной строкой кода, без плагинов - Плагин PHP Native Password Hash остается рабочим вариантом для версий ниже 6.8 и дает тонкую настройку параметров Argon2 через
wp-config.php
Что такое хеширование и зачем оно WordPress
Хеширование, одностороннее криптографическое преобразование. Из строки любой длины вы получаете «отпечаток» фиксированного размера. Обратить хеш в исходный пароль математически невозможно, можно только перебирать варианты и сравнивать хеши.

В отличие от шифрования, где данные восстанавливаются ключом, хеш, билет в один конец. Когда вы вводите пароль при входе, WordPress пропускает его через ту же хеш-функцию и сравнивает результат с сохраненным в базе. Совпало, доступ открыт. Нет, отказ.
WordPress хранит хеши в таблице wp_users, поле user_pass. Если база данных утечет, а такое случалось даже с гигантами: LinkedIn, Yahoo и Tumblr теряли сотни миллионов записей, злоумышленник получит не читаемые пароли, а длинные bcrypt-строки. Восстановить пароль из такой строки нельзя. Но подобрать через словарную атаку можно, если алгоритм слабый или устаревший. Именно поэтому так важна эволюция хеширования в WordPress.
Как WordPress хешировал пароли раньше: MD5 и phpass
До версии 2.5 (2008 год) WordPress использовал чистый MD5. Алгоритм превращает пароль любой длины в 128-битный хеш из 32 шестнадцатеричных символов. Выглядит надежно, но MD5 уязвим для радужных таблиц, заранее вычисленных баз хешей для миллиардов типичных паролей. Хакер с доступом к базе просто ищет хеш в такой таблице и мгновенно получает исходный пароль.
С версии 2.5 WordPress перешел на phpass, портативную библиотеку на основе bcrypt (Blowfish). Она добавляла к паролю случайную «соль» и многократно пропускала результат через хеш-функцию (по умолчанию 2^8 = 256 итераций). Соль делала радужные таблицы бесполезными: два одинаковых пароля у разных пользователей давали разные хеши. При этом phpass сохранял обратную совместимость с MD5, старые пароли не ломались, а при входе плавно обновлялись до нового формата.
Этого хватало долгие годы. Но индустрия ушла вперед: современное железо, GPU-фермы и ASIC, перебирает миллиарды хешей в секунду. Алгоритм bcrypt с настраиваемой стоимостью итераций (cost factor) стал индустриальным стандартом. И начиная с WordPress 6.8 ядро использует его нативно.
WordPress 6.8 и bcrypt: что изменилось
Релиз WordPress 6.8 «Cecil» (апрель 2025) принес полный переход на bcrypt. Раньше ядро использовало собственный класс PasswordHash из библиотеки phpass, теперь вызывается нативная PHP-функция password_hash() с константой PASSWORD_BCRYPT.

Главные изменения в функции wp_hash_password():
- bcrypt по умолчанию. Все новые пароли хешируются через
password_hash()с алгоритмом bcrypt и cost factor, заданным сервером PHP (обычно 10). - Автомиграция старых паролей. При входе пользователя WordPress проверяет через
password_needs_rehash(), не пора ли обновить хеш. Старый формат phpass ($P$...) прозрачно заменяется на bcrypt. - Защита длинных паролей. bcrypt обрезает пароли длиннее 72 байт, снижая энтропию. WordPress 6.8 решает это предварительным хешированием через SHA-384 с доменным ключом
wp-sha384и кодированием в base64. Пароль из 100 символов сохраняет полную стойкость. - Фильтры для гибкой настройки. Появились хуки
wp_hash_password_algorithm(выбор алгоритма) иwp_hash_password_options(параметры: cost, memory_cost, threads).
Вызов wp_hash_password() в ядре WordPress 6.8 выглядит так:
1 function wp_hash_password( $password ) { 2 global $wp_hasher; 3 4 if ( ! empty( $wp_hasher ) ) { 5 return $wp_hasher->HashPassword( trim( $password ) ); 6 } 7 8 if ( strlen( $password ) > 4096 ) { 9 return '*'; 10 } 11 12 $algorithm = apply_filters( 'wp_hash_password_algorithm', PASSWORD_BCRYPT ); 13 $options = apply_filters( 'wp_hash_password_options', array(), $algorithm ); 14 15 if ( PASSWORD_BCRYPT !== $algorithm ) { 16 return password_hash( $password, $algorithm, $options ); 17 } 18 19 $password_to_hash = base64_encode( 20 hash_hmac( 'sha384', trim( $password ), 'wp-sha384', true ) 21 ); 22 23 return '$wp' . password_hash( $password_to_hash, $algorithm, $options ); 24 }
Функция сначала проверяет, не переопределена ли логика хеширования внешним плагином (глобальная переменная $wp_hasher). Затем отсекает пароли длиннее 4096 символов, такие попытки входа возвращают *, что делает аутентификацию невозможной. Дальше, самое интересное: фильтр wp_hash_password_algorithm определяет алгоритм. Если выбран НЕ bcrypt, пароль хешируется напрямую. Если bcrypt, пароль сначала проходит SHA-384 с ключом wp-sha384, кодируется в base64, и только потом передается в password_hash(). На выходе, хеш с префиксом $wp, который отличает «вордпрессовский» bcrypt от ванильного. Полезно при аудите базы или интеграции с внешними системами.
Как усилить хеширование до Argon2
bcrypt, отличный базовый уровень. Следующий шаг, Argon2, победитель конкурса Password Hashing Competition 2015 года. Argon2 специально спроектирован для противодействия GPU-атакам: он требователен к памяти, а видеокарты здесь, узкое место.

Вариант 1: хук wp_hash_password_algorithm (WordPress 6.8+)
Добавьте в functions.php дочерней темы или через плагин Code Snippets:
1 add_filter( 'wp_hash_password_algorithm', function() { 2 return PASSWORD_ARGON2ID; 3 });
Пара секунд, и WordPress переходит на Argon2ID. Старые пароли автоматически перехешируются при входе пользователей. Хостинг должен поддерживать Argon2 в PHP, нужна версия 7.3 или новее для Argon2ID. Проверить доступность можно вызовом password_algos().
Для тонкой настройки параметров используйте парный хук:
1 add_filter( 'wp_hash_password_options', function( $options, $algorithm ) { 2 if ( PASSWORD_ARGON2ID === $algorithm ) { 3 return array( 4 'memory_cost' => 65536, // 64 MB 5 'time_cost' => 4, 6 'threads' => 2, 7 ); 8 } 9 return $options; 10 }, 10, 2 );
Параметр memory_cost определяет, сколько памяти обязан использовать алгоритм при вычислении хеша, чем больше, тем сложнее GPU-перебор. time_cost задает количество итераций, а threads, число потоков.
Вариант 2: плагин PHP Native Password Hash
Для версий WordPress младше 6.8 плагин PHP Native Password Hash делает то же самое. Он подменяет всю логику хеширования на нативный password_hash(), поддерживает bcrypt и Argon2, и не имеет интерфейса, все настройки через константы в wp-config.php:
1 define( 'WP_PASSWORD_HASH_ALGO', PASSWORD_ARGON2ID ); 2 define( 'WP_PASSWORD_HASH_OPTIONS', [ 3 'memory_cost' => 65536, 4 'time_cost' => 4, 5 'threads' => 2, 6 ] );
Плагин не обновлялся более двух лет, но его код минимален и стабилен. С WordPress 6.8 его функциональность встроена в ядро, можно удалить и пользоваться нативными фильтрами.
Хеш-генераторы: что работает сегодня
Бывают ситуации, когда хеш нужно сгенерировать вручную: напрямую записать пароль в базу через phpMyAdmin или перенести пользователей из внешней системы.

Онлайн-генератор с passwordtool.hu, популярный в эпоху старых версий WordPress, больше недоступен: сайт сменил владельца. Рабочие альтернативы сегодня:
- WP-CLI: команда
wp user update <id> --user_pass="новыйпароль"сделает все правильно черезwp_hash_password(). Быстро, безопасно и гарантированно правильно. - PHP-скрипт в корне сайта: временно создайте файл с вызовом
echo wp_hash_password('пароль');и удалите сразу после использования. - Любой онлайн-генератор bcrypt: например, bcrypt.online. Но помните: WordPress 6.8 добавляет префикс
$wpи SHA-384 предхеширование, так что ванильный bcrypt-хеш не подойдет для прямой вставки в базу.
На практике надежнее всего, WP-CLI.
Как выбрать пароль, который не взломают
Даже bcrypt не спасет, если пароль, admin123. Хакеры начинают атаку именно со словарного перебора.

Инструмент zxcvbn от Dropbox, встроенный в WordPress для оценки паролей в админке, отклоняет распространенные шаблоны: даты рождения, 123456 и qwerty, имена питомцев. Он анализирует пароль по словарям, раскладкам клавиатуры и шаблонам замены символов. Оценка «слабый» означает, что пароль угадывается за секунды.
Три практических правила:
- Случайные слова, а не символьная каша. Пароль из четырех-пяти несвязанных английских слов с разделителями (например,
correct-horse-battery-staple) запоминается легче, чемTr0ub4dor&3, а подбирается в разы дольше. - Длина важнее сложности. Шестнадцать случайных строчных букв дают большую энтропию, чем 8 символов со спецзнаками. А bcrypt в WordPress 6.8 через SHA-384 предхеширование сохраняет энтропию паролей любой разумной длины.
- Менеджер паролей. Человеческая память, плохой инструмент для десятка уникальных паролей. 1Password, платный эталон с family-планом, KeePass, бесплатный опенсорс с локальной базой, Bitwarden, золотая середина: бесплатный, облачный, открытый код.

Менеджер генерирует, хранит и автозаполняет пароли. Вам остается запомнить только один мастер-пароль. А если сайт поддерживает двухфакторную аутентификацию, включите ее обязательно. Пароль плюс одноразовый код из приложения делают вход практически неуязвимым.
Видео: как работает хеширование паролей в WordPress
Короткое пояснение механизма хеширования, от ввода пароля до хранения в базе данных WordPress:
⁉️🤔 Частые вопросы
Пароли, захешированные старым MD5, все еще работают в WordPress 6.8+?
Да. При входе пользователя WordPress видит старый формат хеша, проверяет пароль через прежний алгоритм, и если все верно, прозрачно обновляет хеш до bcrypt. Удалять старых пользователей или принудительно сбрасывать пароли не нужно.
Нужен ли плагин PHP Native Password Hash на WordPress 6.8 и новее?
Нет. Все, что делал плагин, хеширование через
password_hash()и поддержка Argon2, теперь доступно через нативные фильтрыwp_hash_password_algorithmиwp_hash_password_options. Плагин остается актуальным только для версий ниже 6.8.
Можно ли вернуться с Argon2 обратно на bcrypt?
Технически да, поменяв алгоритм в фильтре. Но старые Argon2-хеши не будут распознаны, и пользователям придется сбрасывать пароли. Если экспериментируете с алгоритмом на живом сайте, сначала сделайте полный бэкап базы данных.
Помогает ли bcrypt при утечке базы данных?
bcrypt делает перебор паролей по утекшим хешам в сотни тысяч раз медленнее, чем MD5. При cost factor 10 один хеш на современном CPU подбирается около 0,1 секунды, миллиард вариантов займет годы. Но если пароль
password, его найдут в первой же итерации словарной атаки. Алгоритм защищает сложные пароли; слабые не спасет ничто.
Как проверить, что мои пароли хешируются bcrypt?
Загляните в таблицу
wp_usersчерез phpMyAdmin. Полеuser_passу новых пользователей (и тех, кто залогинился после обновления до 6.8) должно начинаться с префикса$wp(признак нового bcrypt-формата WordPress). Старые phpass-хеши выглядят как$P$B.... Для массовой проверки выполните SQL-запрос:SELECT COUNT(*) FROM wp_users WHERE user_pass NOT LIKE '$wp$%' AND user_pass NOT LIKE '$P$%';, он покажет, сколько паролей застряло в устаревшем формате, если такие есть.
Что делать с хешированием WordPress прямо сейчас
Если ваш сайт на WordPress 6.8 или новее, вы уже под bcrypt, делать ничего не нужно. Ядро само обновляет старые хеши при входе пользователей, миграция полностью прозрачна.
Хотите Argon2, добавьте фильтр wp_hash_password_algorithm с PASSWORD_ARGON2ID в functions.php. Предварительно убедитесь, что хостинг поддерживает Argon2: выполните var_dump(password_algos()); через тестовый скрипт. На большинстве современных хостингов поддержка есть.
На версии ниже 6.8 ставьте плагин PHP Native Password Hash, он даст bcrypt или Argon2 без обновления ядра. А заодно запланируйте обновление WordPress: каждое крупное обновление закрывает десятки уязвимостей, не только в хешировании.
И главное, смените admin123 на что-то приличное. Никакой алгоритм не спасет от словарной атаки, если пароль лежит в первой сотне списка rockyou.txt.



