
🔐 Vilken typ av hash använder WordPress
Lösenordet till din adminpanel är det sista som står mellan en hackare och full kontroll över din webbplats. Ett svagt lösenord eller en föråldrad lagringsmekanism gör dyrt webbhotell och en betald brandvägg till ren dekoration.
Under tjugo år har WordPress utvecklats från MD5 till industristandarden bcrypt. Från och med version 6.8 blev lösenordshashningen modern direkt ur kartongen, utan tillägg eller workarounds. Men varje webbplatsägare bör förstå exakt vad som händer med deras lösenord efter att de klickat på "Logga in".
Här är hela kedjan: från att ett lösenord skrivs in i inloggningsformuläret till hashsträngen i databasen. Med kod, filter och specifika inställningar för dig som vill ha mer än vad grundversionen erbjuder.
💡 Snabb översikt:
- WordPress 6.8 och nyare hash:ar lösenord med bcrypt-algoritmen, samma standard som används av banker och myndighetssystem
- Gamla hash:ar (MD5, phpass) uppgraderas automatiskt till bcrypt vid användarens nästa inloggning; migreringen sker sömlöst och kräver ingen manuell åtgärd
- Med filtret
wp_hash_password_algorithmkan du byta till Argon2 med en enda rad kod, inga tillägg behövs - Tillägget PHP Native Password Hash är fortfarande ett gångbart alternativ för versioner under 6.8 och ger finjusterad konfiguration av Argon2-parametrar via
wp-config.php
Vad hashning är och varför WordPress behöver det
Hashning är en kryptografisk envägstransformation. Från en sträng av valfri längd får du ett "fingeravtryck" med fast storlek. Att vända en hash tillbaka till det ursprungliga lösenordet är matematiskt omöjligt; du kan bara prova olika indata och jämföra de resulterande hasharna.

Till skillnad från kryptering, där data kan återskapas med en nyckel, är en hash en enkelbiljett. När du anger ett lösenord vid inloggning kör WordPress det genom samma hashfunktion och jämför resultatet med det som finns lagrat i databasen. Om de matchar beviljas åtkomst. Om inte nekas åtkomst.
WordPress lagrar hash:ar i tabellen wp_users, i fältet user_pass. Om databasen läcker (och detta har hänt även jättar: LinkedIn, Yahoo och Tumblr förlorade hundratals miljoner poster) får en angripare inte läsbara lösenord utan långa bcrypt-strängar. Att återskapa lösenordet från en sådan sträng är omöjligt. Men att gissa det genom en ordboksattack är möjligt om algoritmen är svag eller föråldrad. Det är precis därför utvecklingen av hashning i WordPress spelar så stor roll.
Hur WordPress brukade hasha lösenord: MD5 och phpass
Före version 2.5 (2008) använde WordPress ren MD5. Algoritmen omvandlar vilket lösenord som helst till en 128-bitars hash bestående av 32 hexadecimala tecken. Det ser säkert ut, men MD5 är sårbart för rainbow tables (förberäknade databaser med hash:ar för miljarder vanliga lösenord). En hackare med databasåtkomst slår helt enkelt upp hashen i en sådan tabell och hämtar omedelbart det ursprungliga lösenordet.
Från och med version 2.5 bytte WordPress till phpass, ett portabelt bibliotek baserat på bcrypt (Blowfish). Det lade till slumpmässigt "salt" till lösenordet och körde resultatet genom hashfunktionen flera gånger (som standard 2^8 = 256 iterationer). Salt gjorde rainbow tables oanvändbara: två identiska lösenord för olika användare producerade olika hash:ar. Samtidigt bibehöll phpass bakåtkompatibilitet med MD5; gamla lösenord slutade inte fungera och uppgraderades smidigt till det nya formatet vid inloggning.
Detta var tillräckligt under många år. Men branschen gick framåt: modern hårdvara (GPU-kluster och ASIC:ar) kan prova miljarder hash:ar per sekund. Bcrypt-algoritmen med en konfigurerbar kostnadsfaktor blev industristandard. Och från och med WordPress 6.8 använder grundversionen den inbyggt.
WordPress 6.8 och bcrypt: vad som ändrades
WordPress 6.8 "Cecil"-släppet (april 2025) innebar en fullständig övergång till bcrypt. Tidigare använde grundversionen sin egen PasswordHash-klass från phpass-biblioteket; nu anropar den den inbyggda PHP-funktionen password_hash() med konstanten PASSWORD_BCRYPT.

Viktiga ändringar i funktionen wp_hash_password():
- bcrypt som standard. Alla nya lösenord hash:as via
password_hash()med bcrypt-algoritmen och den kostnadsfaktor som ställts in av PHP-servern (vanligtvis 10). - Automatisk migrering av gamla lösenord. När en användare loggar in kontrollerar WordPress via
password_needs_rehash()om hashen behöver uppdateras. Det gamla phpass-formatet ($P$...) ersätts sömlöst med bcrypt. - Skydd för långa lösenord. bcrypt trunkerar lösenord längre än 72 byte, vilket minskar entropin. WordPress 6.8 löser detta genom att för-hasha med SHA-384 med domännyckeln
wp-sha384och koda i base64. Ett lösenord på 100 tecken behåller sin fulla styrka. - Filter för flexibel konfiguration. Nya hooks tillkom:
wp_hash_password_algorithm(val av algoritm) ochwp_hash_password_options(parametrar: cost, memory_cost, threads).
Anropet till wp_hash_password() i WordPress 6.8:s grundversion ser ut så här:
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 }
Funktionen kontrollerar först om hash-logiken har åsidosatts av ett externt tillägg (den globala variabeln $wp_hasher). Den avvisar sedan lösenord längre än 4096 tecken; sådana inloggningsförsök returnerar *, vilket gör autentisering omöjlig. Sedan kommer den intressanta delen: filtret wp_hash_password_algorithm bestämmer algoritmen. Om valet INTE är bcrypt hash:as lösenordet direkt. Om bcrypt är valt går lösenordet först genom SHA-384 med nyckeln wp-sha384, kodas i base64 och skickas först därefter till password_hash(). Resultatet är en hash med prefixet $wp, vilket skiljer "WordPress"-bcrypt från vanlig bcrypt. Detta är användbart för databasgranskning eller integration med externa system.
Hur du förstärker hashningen med Argon2
bcrypt är en utmärkt grundnivå. Nästa steg är Argon2, vinnaren av Password Hashing Competition 2015. Argon2 designades specifikt för att motstå GPU-attacker: det är minnesintensivt, och grafikkort är flaskhalsen här.

Alternativ 1: hooken wp_hash_password_algorithm (WordPress 6.8+)
Lägg till detta i ditt barntemas functions.php eller via tillägget Code Snippets:
1 add_filter( 'wp_hash_password_algorithm', function() { 2 return PASSWORD_ARGON2ID; 3 });
På ett par sekunder byter WordPress till Argon2ID. Gamla lösenord hash:as om automatiskt när användare loggar in. Ditt webbhotell måste ha stöd för Argon2 i PHP; du behöver version 7.3 eller nyare för Argon2ID. Du kan kontrollera tillgängligheten genom att anropa password_algos().
För att finjustera parametrar använder du den medföljande hooken:
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 );
Parametern memory_cost avgör hur mycket minne algoritmen måste använda vid beräkning av hashen; ju högre värde, desto svårare blir GPU-baserad brute force. time_cost anger antalet iterationer, och threads anger antalet trådar.
Alternativ 2: tillägget PHP Native Password Hash
För WordPress-versioner under 6.8 gör pluginet PHP Native Password Hash samma sak. Det ersätter all hash-logik med inbyggd password_hash(), stöder bcrypt och Argon2, och har inget gränssnitt; alla inställningar görs via konstanter i 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 ] );
Pluginet har inte uppdaterats på över två år, men koden är minimal och stabil. Med WordPress 6.8 är funktionaliteten inbyggd i kärnan, så du kan avinstallera det och använda inbyggda filter istället.
Hash-generatorer: vad som fungerar idag
Det finns situationer när du behöver generera en hash manuellt: att skriva ett lösenord direkt i databasen via phpMyAdmin eller migrera användare från ett externt system.

Onlinegeneratorn från passwordtool.hu, populär under äldre WordPress-versioners tid, är inte längre tillgänglig: sajten bytte ägare. Fungerande alternativ idag:
- WP-CLI: kommandot
wp user update <id> --user_pass="newpassword"gör allt korrekt viawp_hash_password(). Snabbt, säkert och garanterat rätt. - Ett PHP-skript i sajtroten: skapa tillfälligt en fil med ett anrop till
echo wp_hash_password('password');och ta bort den direkt efter användning. - Vilken bcrypt-generator online som helst: till exempel bcrypt.online. Men kom ihåg: WordPress 6.8 lägger till prefixet
$wpoch SHA-384-förhashning, så en vanlig bcrypt-hash fungerar inte för direkt inmatning i databasen.
I praktiken är WP-CLI det mest pålitliga alternativet.
Hur du väljer ett lösenord som inte knäcks
Inte ens bcrypt räddar dig om lösenordet är admin123. Hackare inleder sin attack med ordliste-baserad brute force.

Verktyget zxcvbn från Dropbox, inbyggt i WordPress för lösenordsutvärdering i adminpanelen, avvisar vanliga mönster: födelsedatum, 123456 och qwerty, husdjursnamn. Det analyserar lösenord mot ordlistor, tangentbordslayouter och teckensubstitutionsmönster. Betyget "svagt" innebär att lösenordet kan gissas på sekunder.
Tre praktiska regler:
- Slumpmässiga ord, inte teckensoppa. Ett lösenord som består av fyra eller fem obesläktade engelska ord med avgränsare (till exempel
correct-horse-battery-staple) är lättare att komma ihåg änTr0ub4dor&3och tar mycket längre tid att knäcka. - Längd betyder mer än komplexitet. Sexton slumpmässiga gemener ger högre entropi än 8 tecken med specialsymboler. Och bcrypt i WordPress 6.8 bevarar entropin för lösenord av rimlig längd genom SHA-384-förhashning.
- Använd en lösenordshanterare. Människans minne är ett dåligt verktyg för att hantera ett dussin unika lösenord. 1Password är den betalda guldstandarden med familjeabonnemang, KeePass är gratis öppen källkod med lokal databas, Bitwarden är den lyckliga medelvägen: gratis, molnbaserad och öppen källkod.

En lösenordshanterare genererar, lagrar och fyller i lösenord automatiskt. Du behöver bara komma ihåg ett huvudlösenord. Och om sajten stöder tvåfaktorsautentisering, aktivera det utan undantag. Ett lösenord plus en engångskod från en app gör inloggning praktiskt taget osårbar.
Video: hur lösenordshashning fungerar i WordPress
En kort förklaring av hashmekanismen, från inmatning av ett lösenord till lagring i WordPress-databasen:
⁉️🤔 Vanliga frågor
Fungerar lösenord hashade med gammal MD5 fortfarande i WordPress 6.8+?
Ja. När en användare loggar in upptäcker WordPress det gamla hashformatet, verifierar lösenordet med den tidigare algoritmen, och om allt stämmer uppgraderas hashen sömlöst till bcrypt. Det finns inget behov av att ta bort gamla användare eller tvinga fram lösenordsbyten.
Behövs tillägget PHP Native Password Hash på WordPress 6.8 och nyare?
Nej. Allt tillägget gjorde (hashning via
password_hash()och Argon2-stöd) är nu tillgängligt via de inbyggda filtrenwp_hash_password_algorithmochwp_hash_password_options. Tillägget är bara relevant för versioner under 6.8.
Kan jag byta tillbaka från Argon2 till bcrypt?
Tekniskt sett ja, genom att ändra algoritmen i filtret. Men gamla Argon2-hashar kommer inte att kännas igen, och användare måste återställa sina lösenord. Om du experimenterar med algoritmer på en aktiv sajt, gör en fullständig databassäkerhetskopia först.
Hjälper bcrypt om databasen läcker?
bcrypt gör brute force-knäckning av lösenord från läckta hashar hundratusentals gånger långsammare än MD5. Med en kostnadsfaktor på 10 tar en hash på en modern CPU cirka 0,1 sekunder att beräkna; en miljard försök skulle ta år. Men om lösenordet är
passwordhittas det i den allra första iterationen av en ordlisteattack. Algoritmen skyddar komplexa lösenord; ingenting kan rädda svaga.
Hur verifierar jag att mina lösenord hashras med bcrypt?
Kontrollera tabellen
wp_usersvia phpMyAdmin. Fältetuser_passför nya användare (och de som loggat in efter uppgradering till 6.8) ska börja med prefixet$wp(markören för WordPress nya bcrypt-format). Gamla phpass-hashar ser ut som$P$B.... För en masskontroll, kör denna SQL-fråga:SELECT COUNT(*) FROM wp_users WHERE user_pass NOT LIKE '$wp$%' AND user_pass NOT LIKE '$P$%';. Den visar hur många lösenord som eventuellt sitter fast i ett föråldrat format.
Vad du ska göra åt WordPress-hashning just nu
Om din WordPress-sajt är på version 6.8 eller nyare är du redan skyddad av bcrypt; du behöver inte göra någonting. Kärnan uppgraderar automatiskt gamla hashar när användare loggar in, och migreringen är helt sömlös.
Om du vill ha Argon2, lägg till filtret wp_hash_password_algorithm med PASSWORD_ARGON2ID i functions.php. Kontrollera först att din hosting stöder Argon2: kör var_dump(password_algos()); via ett testskript. De flesta moderna webbhotell har stöd.
För versioner under 6.8, installera pluginet PHP Native Password Hash; det ger dig bcrypt eller Argon2 utan att du behöver uppdatera kärnan. Och schemalägg en WordPress-uppdatering medan du ändå håller på: varje större uppdatering täpper till dussintals sårbarheter, inte bara i hashningen.
Och viktigast av allt, byt ut admin123 mot något vettigt. Ingen algoritm kan rädda dig från en ordboksattack om ditt lösenord finns bland de första hundra posterna i listan rockyou.txt.



