Skip to content

Alt om WordPress, webutvikling — og mer til

🔐 Hva slags hash bruker WordPress

🔐 Hva slags hash bruker WordPress

Passordet til administrasjonspanelet ditt er det siste som står mellom en hacker og full kontroll over nettstedet ditt. Et svakt passord eller en utdatert lagringsmekanisme gjør dyr hosting og en betalt brannmur til ren pynt.

Over tjue år har WordPress utviklet seg fra MD5 til bcrypt på industrinivå. Fra og med versjon 6.8 ble passordhashing moderne rett ut av esken, uten utvidelser eller omveier. Men enhver nettstedseier bør forstå nøyaktig hva som skjer med passordet deres etter å ha klikket «Logg inn».

Nedenfor finner du hele kjeden: fra å skrive inn et passord i påloggingsskjemaet til hash-strengen i databasen. Med kode, filtre og spesifikke innstillinger for dem som ønsker mer enn det kjernen tilbyr.

💡 Rask oversikt:

  • WordPress 6.8 og nyere hasher passord ved hjelp av bcrypt-algoritmen, den samme standarden som brukes av banker og offentlige systemer
  • Gamle hasher (MD5, phpass) oppgraderes automatisk til bcrypt ved brukerens neste pålogging; migreringen er sømløs og krever ingen manuell handling
  • Filteret wp_hash_password_algorithm lar deg bytte til Argon2 med én enkelt kodelinje, uten behov for utvidelser
  • Utvidelsen PHP Native Password Hash er fortsatt et levedyktig alternativ for versjoner under 6.8 og gir finjustert konfigurasjon av Argon2-parametere via wp-config.php

Hva hashing er og hvorfor WordPress trenger det

Hashing er en enveis kryptografisk transformasjon. Fra en streng av vilkårlig lengde får du et «fingeravtrykk» med fast størrelse. Å reversere en hash tilbake til det opprinnelige passordet er matematisk umulig; du kan bare prøve ulike inndata og sammenligne de resulterende hashene.

Diagram for passordhashing i WordPress

I motsetning til kryptering, der data kan gjenvinnes med en nøkkel, er en hash en enveisbillett. Når du skriver inn et passord under pålogging, kjører WordPress det gjennom den samme hash-funksjonen og sammenligner resultatet med det som er lagret i databasen. Hvis de stemmer overens, gis tilgang. Hvis ikke, nektes tilgang.

WordPress lagrer hasher i wp_users-tabellen, i feltet user_pass. Hvis databasen lekker (og dette har skjedd selv for giganter: LinkedIn, Yahoo og Tumblr mistet hundrevis av millioner poster), får en angriper ikke lesbare passord, men lange bcrypt-strenger. Å gjenopprette passordet fra en slik streng er umulig. Men å gjette det gjennom et ordbokangrep er mulig hvis algoritmen er svak eller utdatert. Det er nettopp derfor utviklingen av hashing i WordPress betyr så mye.

Hvordan WordPress pleide å hashe passord: MD5 og phpass

Før versjon 2.5 (2008) brukte WordPress ren MD5. Algoritmen transformerer ethvert passord til en 128-bits hash bestående av 32 heksadesimale tegn. Det ser sikkert ut, men MD5 er sårbart for regnbuetabeller (forhåndsberegnede databaser med hasher for milliarder av vanlige passord). En hacker med databasetilgang slår ganske enkelt opp hashen i en slik tabell og henter øyeblikkelig det opprinnelige passordet.

Fra og med versjon 2.5 gikk WordPress over til phpass, et portabelt bibliotek basert på bcrypt (Blowfish). Det la til tilfeldig «salt» i passordet og kjørte resultatet gjennom hash-funksjonen flere ganger (som standard 2^8 = 256 iterasjoner). Salt gjorde regnbuetabeller ubrukelige: to identiske passord for ulike brukere produserte forskjellige hasher. Samtidig opprettholdt phpass bakoverkompatibilitet med MD5; gamle passord sluttet ikke å fungere og ble smidig oppgradert til det nye formatet ved pålogging.

Dette var tilstrekkelig i mange år. Men bransjen beveget seg fremover: moderne maskinvare (GPU-farmer og ASIC-er) kan prøve milliarder av hasher per sekund. Bcrypt-algoritmen med en konfigurerbar kostnadsfaktor ble industristandarden. Og fra og med WordPress 6.8 bruker kjernen den naturlig.

WordPress 6.8 og bcrypt: hva som endret seg

WordPress 6.8 «Cecil»-utgivelsen (april 2025) brakte en fullstendig overgang til bcrypt. Tidligere brukte kjernen sin egen PasswordHash-klasse fra phpass-biblioteket; nå kaller den den innebygde PHP-funksjonen password_hash() med konstanten PASSWORD_BCRYPT.

WordPress-sikkerhet med innebygd PHP-hashing

Viktige endringer i funksjonen wp_hash_password():

  • bcrypt som standard. Alle nye passord hashes via password_hash() ved hjelp av bcrypt-algoritmen og kostnadsfaktoren satt av PHP-serveren (vanligvis 10).
  • Auto-migrering av gamle passord. Når en bruker logger inn, sjekker WordPress via password_needs_rehash() om hashen trenger oppdatering. Det gamle phpass-formatet ($P$...) erstattes sømløst med bcrypt.
  • Beskyttelse for lange passord. bcrypt avkorter passord lengre enn 72 byte, noe som reduserer entropien. WordPress 6.8 løser dette ved å forhåndshashe med SHA-384 ved hjelp av domenenøkkelen wp-sha384 og kode i base64. Et passord på 100 tegn beholder sin fulle styrke.
  • Filtre for fleksibel konfigurasjon. Nye kroker dukket opp: wp_hash_password_algorithm (algoritmevalg) og wp_hash_password_options (parametere: cost, memory_cost, threads).

Kallet til wp_hash_password() i WordPress 6.8-kjernen ser slik ut:

1function 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}

Funksjonen sjekker først om hashing-logikken har blitt overstyrt av en ekstern utvidelse (den globale variabelen $wp_hasher). Den avviser deretter passord lengre enn 4096 tegn; slike påloggingsforsøk returnerer *, noe som gjør autentisering umulig. Så kommer den interessante delen: filteret wp_hash_password_algorithm bestemmer algoritmen. Hvis valget IKKE er bcrypt, hashes passordet direkte. Hvis bcrypt er valgt, går passordet først gjennom SHA-384 med nøkkelen wp-sha384, kodes i base64, og først deretter sendes det til password_hash(). Resultatet er en hash med prefikset $wp, som skiller «WordPress»-bcrypt fra vanlig bcrypt. Dette er nyttig for databaserevisjoner eller integrasjon med eksterne systemer.

Hvordan styrke hashing med Argon2

bcrypt er en utmerket grunnlinje. Neste steg er Argon2, vinneren av Password Hashing Competition i 2015. Argon2 ble spesielt designet for å motstå GPU-angrep: det er minnekrevende, og skjermkort er flaskehalsen her.

Kodeeksempel for å bytte WordPress til Argon2

Alternativ 1: kroken wp_hash_password_algorithm (WordPress 6.8+)

Legg dette til i barnetemaets functions.php eller via utvidelsen Code Snippets:

1add_filter( 'wp_hash_password_algorithm', function() {
2 return PASSWORD_ARGON2ID;
3});

I løpet av et par sekunder bytter WordPress til Argon2ID. Gamle passord rehashes automatisk når brukere logger inn. Hostingen din må støtte Argon2 i PHP; du trenger versjon 7.3 eller nyere for Argon2ID. Du kan sjekke tilgjengelighet ved å kalle password_algos().

For finjustering av parametere, bruk den tilhørende kroken:

1add_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 );

Parameteren memory_cost bestemmer hvor mye minne algoritmen må bruke ved beregning av hashen; jo høyere verdi, desto vanskeligere blir GPU-basert brute-forcing. time_cost angir antall iterasjoner, og threads angir antall tråder.

Alternativ 2: utvidelsen PHP Native Password Hash

For WordPress-versjoner under 6.8 gjør utvidelsen PHP Native Password Hash det samme. Den erstatter all hashing-logikk med innebygd password_hash(), støtter bcrypt og Argon2, og har ikke noe grensesnitt; alle innstillinger konfigureres via konstanter i wp-config.php:

1define( 'WP_PASSWORD_HASH_ALGO', PASSWORD_ARGON2ID );
2define( 'WP_PASSWORD_HASH_OPTIONS', [
3 'memory_cost' => 65536,
4 'time_cost' => 4,
5 'threads' => 2,
6] );

Utvidelsen har ikke blitt oppdatert på over to år, men koden er minimal og stabil. Med WordPress 6.8 er funksjonaliteten innebygd i kjernen, så du kan avinstallere den og bruke native filtre i stedet.

Hash-generatorer: hva som fungerer i dag

Det finnes situasjoner der du må generere en hash manuelt: å skrive et passord direkte til databasen via phpMyAdmin eller migrere brukere fra et eksternt system.

Generator for WordPress-passordhash via WP-CLI

Den nettbaserte generatoren fra passwordtool.hu, populær i tiden med eldre WordPress-versjoner, er ikke lenger tilgjengelig: nettstedet skiftet eier. Fungerende alternativer i dag:

  • WP-CLI: kommandoen wp user update <id> --user_pass="newpassword" gjør alt riktig gjennom wp_hash_password(). Raskt, sikkert og garantert korrekt.
  • Et PHP-skript i nettstedets rot: opprett midlertidig en fil med et kall til echo wp_hash_password('password'); og slett den umiddelbart etter bruk.
  • En hvilken som helst online bcrypt-generator: for eksempel bcrypt.online. Men husk: WordPress 6.8 legger til $wp-prefikset og SHA-384-forhashing, så en vanlig bcrypt-hash vil ikke fungere for direkte innsetting i databasen.

I praksis er WP-CLI det mest pålitelige alternativet.

Hvordan velge et passord som ikke blir knekt

Selv bcrypt redder deg ikke hvis passordet er admin123. Hackere starter angrepet med ordbokbasert brute force.

Grensesnitt for sjekk av passordstyrke i WordPress

Verktøyet zxcvbn fra Dropbox, innebygd i WordPress for passordvurdering i administrasjonspanelet, avviser vanlige mønstre: fødselsdatoer, 123456 og qwerty, kjæledyrnavn. Det analyserer passord opp mot ordbøker, tastaturoppsett og mønstre for tegnerstatning. En vurdering på «svakt» betyr at passordet kan gjettes i løpet av sekunder.

Tre praktiske regler:

  • Tilfeldige ord, ikke tegnsuppe. Et passord bestående av fire eller fem urelaterte engelske ord med skilletegn (for eksempel correct-horse-battery-staple) er lettere å huske enn Tr0ub4dor&3 og tar langt lengre tid å knekke.
  • Lengde betyr mer enn kompleksitet. Seksten tilfeldige små bokstaver gir større entropi enn 8 tegn med spesialsymboler. Og bcrypt i WordPress 6.8 bevarer entropien til passord av enhver rimelig lengde gjennom SHA-384-forhashing.
  • Bruk en passordbehandler. Menneskelig hukommelse er et dårlig verktøy for å håndtere et dusin unike passord. 1Password er den betalte gullstandarden med en familieplan, KeePass er gratis åpen kildekode med en lokal database, Bitwarden er den gylne middelvei: gratis, skybasert og åpen kildekode.
Passordbehandler for lagring av WordPress-pålogginger

En passordbehandler genererer, lagrer og autofyller passord. Du trenger bare å huske ett hovedpassord. Og hvis nettstedet støtter tofaktorautentisering, aktiver det uten unntak. Et passord pluss en engangskode fra en app gjør innlogging praktisk talt usårbar.

Video: hvordan passordhashing fungerer i WordPress

En kort forklaring av hashingmekanismen, fra å skrive inn et passord til lagring i WordPress-databasen:

⁉️🤔 Ofte stilte spørsmål

Fungerer passord hashet med gammel MD5 fortsatt i WordPress 6.8+?

Ja. Når en bruker logger inn, oppdager WordPress det gamle hash-formatet, verifiserer passordet ved hjelp av den forrige algoritmen, og hvis alt stemmer, oppgraderer det sømløst hashen til bcrypt. Det er ikke nødvendig å slette gamle brukere eller tvinge frem tilbakestilling av passord.

Er PHP Native Password Hash-pluginen nødvendig på WordPress 6.8 og nyere?

Nei. Alt pluginen gjorde (hashing via password_hash() og Argon2-støtte) er nå tilgjengelig gjennom de innebygde filtrene wp_hash_password_algorithm og wp_hash_password_options. Pluginen er kun relevant for versjoner under 6.8.

Kan jeg bytte tilbake fra Argon2 til bcrypt?

Teknisk sett ja, ved å endre algoritmen i filteret. Men gamle Argon2-hasher vil ikke bli gjenkjent, og brukere må tilbakestille passordene sine. Hvis du eksperimenterer med algoritmer på et aktivt nettsted, ta en full databasebackup først.

Hjelper bcrypt hvis databasen lekker?

bcrypt gjør brute force-angrep på passord fra lekke hasher hundretusenvis av ganger tregere enn MD5. Med en kostnadsfaktor på 10 tar én hash på en moderne CPU omtrent 0,1 sekunder å beregne; en milliard forsøk ville tatt årevis. Men hvis passordet er password, vil det bli funnet i den aller første iterasjonen av et ordbokangrep. Algoritmen beskytter komplekse passord; ingenting kan redde svake.

Hvordan bekrefter jeg at passordene mine blir hashet med bcrypt?

Sjekk wp_users-tabellen via phpMyAdmin. Feltet user_pass for nye brukere (og de som logget inn etter oppgradering til 6.8) skal starte med $wp-prefikset (markøren for WordPress' nye bcrypt-format). Gamle phpass-hasher ser ut som $P$B.... For en masseutsjekk, kjør denne SQL-spørringen: SELECT COUNT(*) FROM wp_users WHERE user_pass NOT LIKE '$wp$%' AND user_pass NOT LIKE '$P$%';. Den vil vise hvor mange passord som sitter fast i et utdatert format, om noen.

Hva du bør gjøre med WordPress-hashing akkurat nå

Hvis WordPress-nettstedet ditt er på versjon 6.8 eller nyere, er du allerede beskyttet av bcrypt; det er ingenting du trenger å gjøre. Kjernen oppgraderer automatisk gamle hasher når brukere logger inn, og migreringen er fullstendig sømløs.

Ønsker du Argon2, legger du til wp_hash_password_algorithm-filteret med PASSWORD_ARGON2ID i functions.php. Sjekk først at hostingleverandøren din støtter Argon2: kjør var_dump(password_algos()); via et testskript. De fleste moderne hostingleverandører har støtte.

For versjoner under 6.8, installer utvidelsen PHP Native Password Hash; den gir deg bcrypt eller Argon2 uten å oppdatere kjernen. Og planlegg en WordPress-oppdatering mens du er i gang: hver større oppdatering lukker dusinvis av sårbarheter, ikke bare i hashing.

Og viktigst av alt, bytt ut admin123 med noe skikkelig. Ingen algoritme kan redde deg fra et ordbokangrep hvis passordet ditt er blant de første hundre oppføringene i rockyou.txt-listen.