
🔐 Який тип хешу використовує 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, платний еталон із сімейним планом, 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.



