17,8 milliarder lækkede konti ligger i dag i databasen bag Have I Been Pwned, fordelt på 1.022 registrerede databrud, ifølge tjenestens egen tæller opdateret 9. oktober 2026. Det er ikke et tal, du kan ignorere, hvis du bruger internettet som dansker. Mellem CPR-registret, Motorstyrelsen og en lang række private virksomheder har danske borgere været med i flere af de brud, der fylder databasen. Denne guide viser dig, trin for trin, hvordan du selv tjekker om din e-mail og dine adgangskoder er lækket, og hvordan du bygger et lille Python-script, der automatiserer tjekket, så du ikke skal huske at gøre det manuelt hver måned.
Du kommer igennem både den manuelle metode på haveibeenpwned.com, den tekniske k-anonymity-model der gør det sikkert at tjekke en adgangskode uden at sende den i klartekst til en server, og et komplet script du kan køre lokalt eller sætte på en tidsplan. Vi dækker også, hvad du konkret skal gøre, når et tjek viser et fund, og hvordan virksomheder kan bruge de samme værktøjer til at opfylde GDPR’s 72-timers-regel for underretning om sikkerhedsbrud.
Hvorfor et databrudstjek er blevet nødvendigt i Danmark og Norden
For få år tilbage var et databrud noget, der primært ramte store amerikanske teknologifirmaer. Det billede holder ikke længere. Danske myndigheder har selv stået for nogle af de største læk herhjemme: CPR-registret blev ramt af et brud, der eksponerede data på 8,8 millioner danskere, mens Motorstyrelsen lækkede oplysninger på 71.000 borgere over en periode på fem år, uden at det blev opdaget undervejs. Region Syddanmark måtte melde et brud, der ramte 23.000 personer, herunder sundhedsdata, som er særligt beskyttet under GDPR.
Mønstret går igen i resten af Norden. Vi har tidligere dækket, hvordan 166 registrerede cyberangreb ramte nordiske organisationer i 2025, og analysen pegede på, at ledelseslaget i mange virksomheder fortsat er det svageste led i responsen, ikke selve den tekniske sikring. Det samme mønster ses i private tjenester. Password manager-tjenesten Dashlane måtte oplyse, at 20 vaults var blevet stjålet i et brud, og en uafhængig analyse fra ETH Zürich fandt 25 separate angrebsveje i flere af markedets mest brugte password managers.
Det, der gør situationen værre, er stealer logs, altså malware der stjæler login-oplysninger direkte fra en inficeret computer og sælger eller deler dem videre i kriminelle fora. HIBP tilføjede for nylig en enkelt stealer log-kilde på 56 millioner unikke e-mailadresser og 124 millioner unikke adgangskoder til sin database. Den slags data cirkulerer ofte i månedsvis, før den bliver offentligt kendt, hvilket betyder at dit login kan være kompromitteret længe før du selv opdager det, hvis du ikke aktivt tjekker.
Konsekvensen for den enkelte dansker er konkret: en lækket adgangskode fra en glemt tjeneste for ti år siden kan stadig bruges i dag, hvis du genbruger den samme kode på din nuværende e-mail eller netbank. Resten af denne guide handler om at gøre det tjek til en vane i stedet for en engangsøvelse.
Forudsætninger: software og adgang du skal have klar
Du behøver ikke meget for at komme igennem guiden. De fleste trin kan gennemføres med en almindelig browser, men hvis du vil bygge og køre scriptet i trin 4 til 9, skal du have følgende klar:
- En computer med Python 3.11 eller nyere installeret (tjek med
python3 --version) - pip, som følger med Python som standard
- Et terminalvindue (Terminal på macOS/Linux, PowerShell eller Windows Terminal på Windows)
- En teksteditor, for eksempel VS Code eller endnu simplere Nano
- En gyldig e-mailadresse, du selv har adgang til, til verifikation på haveibeenpwned.com
- Omkring 30-45 minutter, hvis du følger alle 12 trin inklusive automatisering
Du skal ikke oprette en konto eller betale noget for at følge denne guide. Pwned Passwords-API’en, som scriptet bygger på, er gratis og kræver ingen nøgle. Kun hvis du vil overvåge et helt domæne automatisk, som vi kommer til i trin 10, bliver et betalt API-abonnement relevant.
Vi bruger et virtuelt Python-miljø (venv) i stedet for at installere pakker globalt på din maskine. Det er ikke strengt nødvendigt for et script på denne størrelse, men det er god praksis, fordi det holder projektets afhængigheder isoleret fra resten af systemet og gør det nemt at slette hele miljøet igen, uden at det påvirker andre Python-projekter du har liggende. Har du aldrig brugt venv før, er det bare en mappe med en selvstændig kopi af Python-fortolkeren og dens pakker.
Trin 1: Forstå k-anonymity-modellen bag Have I Been Pwned
Før du begynder at tjekke adgangskoder, bør du forstå hvorfor det overhovedet er sikkert. Når du indtaster en adgangskode på en hjemmeside, er den naturlige bekymring, at du sender din hemmelige kode til endnu en server. Have I Been Pwneds skaber, sikkerhedsforsker Troy Hunt, byggede derfor Pwned Passwords-API’en omkring en teknik kaldet k-anonymity.
Modellen virker sådan: din browser eller dit script hasher adgangskoden lokalt med SHA-1, hvilket giver en streng på 40 hexadecimale tegn. Kun de første 5 tegn af den hash, kaldet præfikset, sendes til HIBP’s server. Serveren svarer med alle de hash-suffikser (de resterende 35 tegn) der deler samme præfiks, sammen med hvor mange gange hver af dem er set i databrud. Dit script sammenligner derefter lokalt, om dit eget suffiks findes på listen. Den fulde adgangskode og den fulde hash forlader aldrig din maskine.
Som Troy Hunt selv beskrev den oprindelige søgefunktion: “Enter your email address and go – any of the sites the address appears breached on will return a result with an overview of what happened to them.” Princippet er det samme for adgangskoder, bare med et ekstra lag af matematisk anonymitet, der betyder at HIBP’s server aldrig kan se, hvilken konkret adgangskode du tjekkede, kun at en af flere hundrede kandidater med samme præfiks blev forespurgt.
Pwned Passwords-databasen rummer i dag mere end 800 millioner unikke lækkede adgangskoder, hver med en tælling af hvor mange gange den er set i de 1.022 registrerede brud. Det er den database, vores script i trin 5 og 6 slår op i.
Det matematiske grundlag er simpelt, men værd at forstå, før du stoler på det. Et SHA-1-hash-præfiks på 5 hexadecimale tegn har 16 i femte potens, altså 1.048.576 mulige kombinationer. Når du sender et præfiks til HIBP’s server, får du typisk flere hundrede kandidat-suffikser retur, ikke bare dit eget. Serveren kan derfor aldrig med sikkerhed afgøre, hvilken af de hundredvis af mulige adgangskoder du reelt tjekkede, selv hvis den logger alle forespørgsler. Det er den samme grundidé, som ligger bag anonymiseret trafikanalyse, blot anvendt på hash-opslag i stedet for netværkstrafik.
Trin 2: Tjek og tolk din e-mail på haveibeenpwned.com
Gå til haveibeenpwned.com og indtast den e-mailadresse, du bruger mest. Du får et øjeblikkeligt svar: enten en grøn bekræftelse på at adressen ikke er fundet i nogen kendte brud, eller en rød oversigt over hvilke tjenester adressen har optrådt i. Det kræver ingen konto at lave dette opslag, kun selve e-mailadressen.
Hvis du vil have løbende overvågning og ikke bare et enkeltstående tjek, kan du klikke på “Notify me” og få tilsendt en bekræftelsesmail. Her er det værd at være opmærksom: HIBP sender en verifikationsmail, og du skal klikke på linket i den, før overvågningen er aktiv. Gør det ikke, hvis mailen kommer fra en afsender, du ikke kan verificere, da falske “du er blevet hacket”-mails er en udbredt phishing-taktik, som vi også har dækket i vores guide til kodeordssikkerhed.
Når du får et rødt resultat, viser hvert brud en række detaljer: navnet på den kompromitterede tjeneste, datoen for bruddet, hvilke datatyper der var involveret (e-mail, adgangskode, telefonnummer, IP-adresse med videre), og om bruddet er markeret “verified” eller “sensitive”. Et verificeret brud betyder, at HIBP’s team selv har bekræftet dataens ægthed. Et “sensitive” brud, som for eksempel datingsider, vises ikke i den offentlige søgning, men kun hvis du har bekræftet ejerskab af e-mailadressen via abonnementsfunktionen.
Trin 3: Tjek dine adgangskoder med Pwned Passwords
Næste skridt er at tjekke de konkrete adgangskoder, du bruger, ikke bare din e-mailadresse. Gå til haveibeenpwned.com/Passwords og indtast en adgangskode. Siden udfører k-anonymity-opslaget direkte i din browser via JavaScript, så selv her sendes kun hash-præfikset over nettet, aldrig den fulde kode.
Får du et resultat der viser adgangskoden er set flere millioner gange, er den ubrugelig som sikkerhedsbarriere, uanset hvor lang eller “kompleks” den ser ud. Mange af de mest lækkede koder i databasen stammer fra store brud som LinkedIn, Adobe og Yahoo for år tilbage, men mønstret gentager sig: folk genbruger dem stadig. Troy Hunt har selv påpeget problemets omfang efter at have analyseret overlap mellem to store historiske brud: “Passwords! and found that 59% of people with accounts in both sources used the same password.” Det tal er fra en analyse af ældre brud, men tendensen til genbrug er ikke blevet mindre udbredt siden.
Tjek både dine vigtigste adgangskoder og eventuelle gamle koder, du stadig bruger på mindre vigtige sider. Husk, at en kode der er “ren” i Pwned Passwords ikke er det samme som en stærk kode. Den er bare ikke (endnu) set i et registreret brud.
Trin 4: Opsæt et Python-miljø til automatiske tjek
Manuelle tjek er fine til et enkeltstående opslag, men hvis du har 20-30 konti og vil gentage tjekket med jævne mellemrum, er det langt hurtigere med et script. Opret en mappe til projektet og et isoleret Python-miljø, så afhængigheder ikke blander sig med resten af dit system:
mkdir hibp-checker && cd hibp-checker
python3 -m venv hibp-env
source hibp-env/bin/activate # Windows: hibp-env\Scripts\activate
pip install requests
Opret derefter en requirements.txt, så miljøet kan genskabes på en anden maskine eller server:
requests>=2.31.0
Det er hele opsætningen. Pwned Passwords-API’en kræver ingen nøgle og ingen godkendelse, kun en gyldig User-Agent-header, som vi tilføjer i næste trin.
Trin 5: Skriv hash- og opslagsfunktionen
Kernen i scriptet er tre linjer: hash adgangskoden lokalt, split hashen i præfiks og suffiks, og forespørg API’en med kun præfikset. Opret en fil kaldet hibp_check.py og start med denne funktion:
import hashlib
import requests
API_URL = "https://api.pwnedpasswords.com/range/{prefix}"
HEADERS = {"User-Agent": "shattered-io-pwned-checker/1.0"}
def check_password(password: str) -> int:
sha1_hash = hashlib.sha1(password.encode("utf-8")).hexdigest().upper()
prefix, suffix = sha1_hash[:5], sha1_hash[5:]
response = requests.get(API_URL.format(prefix=prefix), headers=HEADERS, timeout=10)
response.raise_for_status()
for line in response.text.splitlines():
hash_suffix, count = line.split(":")
if hash_suffix == suffix:
return int(count)
return 0
Bemærk User-Agent-headeren. HIBP’s API afviser forespørgsler uden en sat User-Agent med en 403-fejl, fordi tjenesten vil kunne identificere misbrug uden at kræve en fuld API-nøgle til denne gratis funktion. Giv din header et navn, der faktisk beskriver dit script, ikke standardværdien fra et HTTP-bibliotek.
Trin 6: Saml det fulde kontroltjek-script
Tilføj nu en kommandolinje-indgang, så scriptet kan tage en adgangskode som argument eller spørge interaktivt, og formatér svaret som en klar advarsel:
import getpass
import sys
if __name__ == "__main__":
pw = sys.argv[1] if len(sys.argv) > 1 else getpass.getpass("Adgangskode: ")
hits = check_password(pw)
if hits:
print(f"ADVARSEL: Denne adgangskode er fundet {hits:,} gange i kendte databrud.")
print("Skift den med det samme, og tjek om du bruger den andre steder.")
else:
print("Ingen match fundet i Pwned Passwords-databasen.")
print("Det er et godt tegn, men ingen garanti for fuld sikkerhed.")
Vi bruger getpass i stedet for almindelig input(), så adgangskoden ikke vises i klartekst på skærmen eller gemmes i din terminal-historik, hvis du kører scriptet uden argument.
Trin 7: Kør scriptet og tolk output
Gem filen og kør den fra terminalen. Her er et eksempel på output, når en kendt svag adgangskode testes:
$ python3 hibp_check.py
Adgangskode:
ADVARSEL: Denne adgangskode er fundet 3.861.493 gange i kendte databrud.
Skift den med det samme, og tjek om du bruger den andre steder.
Og her ser du svaret for en adgangskode, der (endnu) ikke er registreret:
$ python3 hibp_check.py
Adgangskode:
Ingen match fundet i Pwned Passwords-databasen.
Det er et godt tegn, men ingen garanti for fuld sikkerhed.
Tallet 3.861.493 i det første eksempel er ikke tilfældigt valgt. De mest udbredte adgangskoder i databasen, som “123456” eller “password”, optræder flere millioner gange, fordi de samme koder går igen tværs gennem årtiers databrud. Jo højere tal, jo mere sandsynligt er det, at angribere allerede tester netop den kode i automatiserede login-forsøg mod andre tjenester, en teknik kaldet credential stuffing.
Trin 8: Udvid til batch-tjek af flere adgangskoder
Har du mange konti, vil du sjældent sidde og teste én kode i gangen. Tilføj en funktion, der læser en liste fra en fil og tjekker dem alle, uden at adgangskoderne selv printes i output:
def check_many(passwords_file: str) -> None:
with open(passwords_file, encoding="utf-8") as f:
passwords = [line.strip() for line in f if line.strip()]
for index, pw in enumerate(passwords, start=1):
hits = check_password(pw)
status = f"{hits:,} gange" if hits else "ingen match"
print(f"Kode #{index}: {status}")
Gem listen i en fil uden for projektmappen, og slet den igen når tjekket er færdigt. Scriptet identificerer kun koder med nummer, aldrig med den faktiske værdi, netop for at undgå at du ender med en fil fuld af dine egne hemmeligheder liggende i klartekst på disken.
Det samlede projekt: hele scriptet i én fil
Før vi går videre til automatisering, er det praktisk at have hele projektet samlet i én fungerende fil, i stedet for de enkelte stumper fra trin 5 til 8. Her er den komplette hibp_check.py, klar til at blive gemt og køre direkte efter opsætningen i trin 4:
#!/usr/bin/env python3
"""Tjek adgangskoder mod Have I Been Pwneds Pwned Passwords API via k-anonymity."""
import getpass
import hashlib
import sys
import time
import requests
API_URL = "https://api.pwnedpasswords.com/range/{prefix}"
HEADERS = {"User-Agent": "shattered-io-pwned-checker/1.0"}
def check_password(password: str) -> int:
sha1_hash = hashlib.sha1(password.encode("utf-8")).hexdigest().upper()
prefix, suffix = sha1_hash[:5], sha1_hash[5:]
response = requests.get(API_URL.format(prefix=prefix), headers=HEADERS, timeout=10)
response.raise_for_status()
for line in response.text.splitlines():
hash_suffix, count = line.split(":")
if hash_suffix == suffix:
return int(count)
return 0
def check_many(passwords_file: str) -> None:
with open(passwords_file, encoding="utf-8") as f:
passwords = [line.strip() for line in f if line.strip()]
for index, pw in enumerate(passwords, start=1):
hits = check_password(pw)
status = f"{hits:,} gange" if hits else "ingen match"
print(f"Kode #{index}: {status}")
time.sleep(1.5)
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "--batch":
check_many(sys.argv[2])
else:
pw = sys.argv[1] if len(sys.argv) > 1 else getpass.getpass("Adgangskode: ")
hits = check_password(pw)
if hits:
print(f"ADVARSEL: Denne adgangskode er fundet {hits:,} gange i kendte databrud.")
print("Skift den med det samme, og tjek om du bruger den andre steder.")
else:
print("Ingen match fundet i Pwned Passwords-databasen.")
print("Det er et godt tegn, men ingen garanti for fuld sikkerhed.")
Kør den som python3 hibp_check.py for et enkelt tjek, eller python3 hibp_check.py --batch koder.txt for at læse en liste af koder fra en fil. Pausen på 1,5 sekund mellem hvert opslag i batch-funktionen er der for at undgå at ramme rate-begrænsningen, hvis du tjekker mange koder i streg, et problem vi kommer tilbage til i fejlfindingsafsnittet.
Trin 9: Automatiser tjekket med cron eller Task Scheduler
Et tjek er en god start, men databasen vokser løbende, hver gang et nyt brud opdages og tilføjes. Sæt derfor scriptet til at køre automatisk. På Linux og macOS bruger du cron:
# Rediger crontab med: crontab -e
# Kør hver søndag kl. 09:00 og log resultatet
0 9 * * 0 /usr/bin/python3 /home/bruger/hibp-checker/hibp_check.py >> /home/bruger/hibp.log 2>&1
På Windows opsætter du samme adfærd via Task Scheduler med en handling, der peger på din Python-fortolker inde i hibp-env og scriptet som argument. Husk at scriptet i sin nuværende form forventer interaktiv input, så til automatiseret kørsel bør du læse koderne fra en krypteret konfigurationsfil eller en miljøvariabel i stedet for getpass, ellers venter jobbet bare uendeligt på et svar, der aldrig kommer.
Trin 10: Brug Mozilla Monitor og browserens indbyggede advarsler
Dit eget script er godt til adgangskoder, men for løbende overvågning af e-mailadresser er et færdigbygget værktøj ofte mere praktisk. Mozilla Monitor bruger den samme HIBP-database i baggrunden og giver dig et dashboard, hvor du kan tilføje flere e-mailadresser og se, hvilke brud der er fundet for hver af dem. Mozilla selv forklarer tjenestens formål kort: den er en “data breach notification service” bygget på HIBP’s database, og den rådgiver dig i, hvad du konkret skal gøre ved hvert fund.
Både Firefox og Chrome har desuden indbyggede advarsler i deres password managers, der flagger gemte login-oplysninger, hvis de matcher et kendt brud. Firefox kalder funktionen Breach Alerts og viser en rød markering direkte i adressefeltets password manager-ikon, mens Chrome bruger en lignende model under “Password Checkup” i indstillingerne. Det er ikke en erstatning for et aktivt tjek, men et nyttigt sikkerhedsnet, hvis du allerede bruger browserens indbyggede kodeordslager i stedet for en selvstændig password manager.
Har du i stedet en dedikeret manager som Bitwarden, bør du være opmærksom på, at selv password managers ikke er immune: en uafhængig ETH Zürich-analyse fandt 25 forskellige angrebsveje i flere populære managers, inklusive Bitwarden, LastPass og Dashlane. Det betyder ikke, at du skal stoppe med at bruge en password manager, kun at den bør kombineres med to-faktor-godkendelse og løbende opdateringer, i stedet for at blive behandlet som en uigennemtrængelig boks.
Trin 11: Reager korrekt, når du finder et læk
Et fund er ikke en krise, men det kræver handling i den rigtige rækkefølge. Følg denne liste, når du ser et rødt resultat:
- Gå direkte til den berørte tjenestes officielle hjemmeside, aldrig via et link fra en mail du har fået tilsendt
- Skift adgangskoden til en ny, unik kode, som du ikke har brugt andre steder
- Tjek om den gamle kode er genbrugt på andre konti, og skift den der også
- Aktivér to-faktor-godkendelse eller passkeys, hvis tjenesten understøtter det
- Log alle aktive sessioner og ukendte enheder ud fra kontoen
- Gennemgå gendannelsesmail og telefonnummer, så en angriber ikke kan omdirigere en password-reset
Troy Hunt har gentagne gange peget på, hvad der reelt flytter nålen mest for den enkelte bruger: “TH: I still feel that having a password manager is the number one thing.” En password manager fjerner incitamentet til at genbruge koder, fordi du aldrig selv skal huske dem. Det samme problem beskriver han direkte: “The prevalence of reuse is nuts,” et udsagn der dækker præcis den adfærd, der gør ét enkelt læk til et problem for ti andre konti.
Husk også, at et fund i en database ikke nødvendigvis betyder, at kontoen stadig er aktivt kompromitteret i dag. Det betyder, at oplysninger knyttet til adressen på et tidspunkt har været en del af et registreret brud. Risikoen er reel, men tidsstemplet på bruddet afgør, hvor akut situationen er.
Trin 12: Avanceret overvågning, API-nøgler og GDPR for virksomheder
Driver du en virksomhed eller administrerer du et domæne med flere medarbejdere, kan et manuelt tjek pr. medarbejder hurtigt blive uoverskueligt. HIBP’s betalte API giver domæneovervågning, hvor hele domænet bekræftes én gang, hvorefter alle tilknyttede e-mailadresser automatisk overvåges. Priserne pr. oktober 2026 ser sådan ud på HIBP’s officielle prisside:
| Abonnement | Rate-grænse | Domæner / adresser | Pris |
|---|---|---|---|
| Core 2 | 50 forespørgsler/min | 3 domæner, maks. 100 brudte adresser | 21,59 USD/md (259,08 USD/år) |
| Core 3 | 100 forespørgsler/min | 5 domæner, maks. 500 brudte adresser | 36,99 USD/md (443,88 USD/år) |
| Core 4 | 500 forespørgsler/min | 10 domæner, ubegrænset antal adresser | 159 USD/md (1.908 USD/år) |
| Pro | Højere grænser | Flere domæner, direkte e-mailsøgning | Fra 379 USD/md |
| Enterprise | Tilpasset | Ubegrænset, k-anonymity e-mailsøgning | Fra 1.150 USD/md |
Den gratis Pwned Passwords-API, som vores script i trin 5 til 8 bruger, kræver stadig ingen nøgle og har ingen rate-begrænsning rettet mod produktionstrafik. Det er kun de brudte-adresse-opslag på domæneniveau, der kræver et betalt abonnement.
For danske virksomheder er det relevante juridiske krav GDPR’s artikel 33, som fastslår at en databehandlingsansvarlig skal underrette den kompetente tilsynsmyndighed om et sikkerhedsbrud uden unødig forsinkelse og, om muligt, ikke senere end 72 timer efter at være blevet bekendt med bruddet, med mindre bruddet vurderes usandsynligt at udgøre en risiko for de registreredes rettigheder. Et automatiseret HIBP-domænetjek kan fungere som en tidlig varsling, der gør det muligt at opdage et brud, før en ekstern kilde gør det for dig, hvilket direkte påvirker, hvor hurtigt 72-timers-klokken kan starte.
Datatilsynet i Danmark har de seneste år skærpet sin praksis for, hvor hurtigt og hvor detaljeret en virksomhed skal dokumentere sin reaktion på et brud, ikke kun om fristen på 72 timer blev holdt. En log, der viser hvornår jeres eget overvågningsscript fangede et nyt fund, og hvilke konkrete skridt der blev taget derefter, er præcis den type dokumentation, et tilsyn vil bede om, hvis sagen eskalerer til en egentlig undersøgelse.
Det er også værd at kende omfanget af, hvad danske myndigheder og virksomheder selv har stået bag af brud de seneste år. Her er et udvalg, vi tidligere har dækket:
| Hændelse | Omfang | Relevans for databrudstjek |
|---|---|---|
| CPR-registret | 8,8 mio. danskere ramt | Praktisk talt hele befolkningen bør tjekke deres data |
| Motorstyrelsen | 71.000 danskere, lækket over 5 år | Langvarige læk opdages ofte sent uden aktiv overvågning |
| Region Syddanmark | 23.000 personer ramt | Sundhedsdata kræver særlig GDPR-opmærksomhed |
| SplitVPN | 865.000 mails, 58 mio. logposter | Viser at selv “no-logs”-tjenester kan lække e-mails |
| Dashlane | 20 vaults stjålet | Selv password managers kan være kilden til et brud |
Se vores generelle gennemgang af, hvordan datalæk opstår og hvordan du beskytter dig, hvis du vil have baggrunden for, hvorfor netop disse hændelser gentager sig år efter år.
Almindelige faldgruber, du skal undgå
De fleste fejl i denne proces handler ikke om teknikken, men om vaner. Her er de mest almindelige, vi ser gå igen:
- At tro et “clean” resultat beviser fuld sikkerhed. HIBP’s database dækker kun kendte, registrerede brud. Et brud, der endnu ikke er opdaget eller offentliggjort, vises naturligvis ikke.
- At indtaste adgangskoder på tredjeparts-sider, der ikke bruger k-anonymity. Nogle useriøse “password checker”-sider ber om den fulde kode uden nogen form for hashing. Brug kun officielle kilder som haveibeenpwned.com eller din egen k-anonymity-kode.
- At skifte adgangskoden ét sted og tro problemet er løst. Hvis koden var genbrugt, er alle de andre konti stadig udsatte, indtil du også skifter dem.
- At forveksle den gratis Pwned Passwords-API med den betalte breach-API. De er to forskellige produkter med forskellige krav til autentificering, og det er en klassisk fejl at tro scriptet kræver en API-nøgle, det ikke gør.
- At klikke på links i mails, der hævder du er “hacket”. Phishing-forsøg efterligner ofte netop den slags advarsler. Gå altid direkte til tjenestens egen adresse i stedet.
- At tjekke én gang og aldrig igen. Databasen vokser konstant. Et tjek i januar siger intet om, hvad der er tilføjet i juni.
Fejlfinding: almindelige problemer og løsninger
Går noget i stykker, mens du følger guiden, er det sjældent noget alvorligt. Her er de problemer, der oftest rammer nye brugere af scriptet:
- 403 Forbidden ved opslag: Du har glemt User-Agent-headeren, eller den er sat til en tom streng. HIBP afviser forespørgsler uden en gyldig header som en simpel beskyttelse mod automatiseret misbrug, selv på den gratis API. Tilføj en beskrivende værdi i HEADERS-dictionaryet, og fejlen forsvinder.
- ModuleNotFoundError: No module named ‘requests’: Du har ikke aktiveret det virtuelle miljø, eller du har glemt
pip install requestsefter aktivering. Kørwhich python3(ellerwhere pythonpå Windows) for at bekræfte, at du rent faktisk peger på Python-fortolkeren inde ihibp-env, ikke systemets globale installation. - 429 Too Many Requests: Du sender forespørgsler for hurtigt i batch-tjekket, typisk fordi du har fjernet eller sænket pausen mellem opslag. Indsæt en kort pause mellem hver forespørgsel, for eksempel med
time.sleep(1.5), og overvej at hæve den yderligere hvis du tjekker flere hundrede koder i én kørsel. - SSL-certifikatfejl på et firmanetværk: En virksomhedsproxy eller en Zscaler/Netskope-opsætning kan afskære og genudstede HTTPS-trafikken med sit eget certifikat, hvilket
requestsikke genkender som troværdigt. Spørg din IT-afdeling om den korrekte CA-bundle-sti, og peg din kode på den med parameterenverify="/sti/til/ca-bundle.pem". - Scriptet finder intet, men du ved kontoen er lækket: Tjek om bruddet er markeret “sensitive” hos HIBP, for eksempel datingsider eller politisk følsomme tjenester. Den type brud kræver kontoejerskab bekræftet via e-mail, før det vises i noget opslag, selv de betalte API-endpoints.
- Verifikationsmailen fra HIBP kommer aldrig: Tjek spamfilteret først. Hvis du bruger en virksomhedsmail med aggressiv filtrering, bed din IT-afdeling om at tilføje domænet til en tilladelsesliste, da mange firewalls fejlagtigt klassificerer sikkerhedsvarsler som spam.
- Hash-sammenligningen matcher aldrig, selv for kendte svage koder: Kontroller at du bruger store bogstaver i hex-strengen med
.upper(). HIBP’s API returnerer suffikser i uppercase, og en mismatch i case mellem din lokale hash og API-svaret giver altid nul match, selv når koden faktisk er lækket. - Cron-jobbet logger ingenting: Brug altid den fulde, absolutte sti til Python-fortolkeren inde i dit virtuelle miljø i crontab-linjen, ikke bare
python3, da cron kører med et minimalt miljø og ikke kender din shells PATH-opsætning. Test altid kommandoen manuelt med den fulde sti, før du lægger den i crontab. - Timeout-fejl ved forespørgsler: API’en er normalt hurtig, men ved dårlig forbindelse eller en overbelastet virksomheds-VPN bør du øge
timeout-parameteren fra 10 til for eksempel 20 sekunder og tilføje en simpel retry-logik omkring kaldet, så en enkelt langsom forespørgsel ikke stopper hele batch-kørslen. - Scriptet printer mystiske tegn i stedet for tal: Det sker typisk, hvis du åbner og gemmer
koder.txti et program, der tilføjer en BOM-markør (byte order mark) i starten af filen. Gem filen som almindelig UTF-8 uden BOM, eller tilføjencoding="utf-8-sig"i stedet forencoding="utf-8", når du åbner filen.
Avancerede tips til et komplet overvågningssetup
Når grundfunktionen kører stabilt, er der et par udvidelser der gør setuppet langt mere robust. Tilføj en kort pause mellem batch-forespørgsler for at undgå 429-fejl på store lister. Log resultatet til en separat fil med tidsstempel, så du kan se udviklingen over tid i stedet for kun det seneste tjek. Overvej at sende en notifikation, for eksempel via en simpel webhook til Slack eller e-mail, hvis scriptet finder et nyt fund, i stedet for at du selv skal huske at læse logfilen.
Hvis du arbejder med NTLM-hashes i et Windows Active Directory-miljø, understøtter samme API-endpoint også NTLM i stedet for SHA-1 via en query-parameter. Det gør det muligt at bygge en intern kontrol, der tjekker brugeres Active Directory-adgangskoder mod Pwned Passwords uden at sende en enkelt fuld adgangskode ud af netværket, en metode HIBP selv dokumenterer som kompatibel med NIST 800-63B’s anbefalinger om at nægte kendte kompromitterede koder ved oprettelse.
Endelig: hvis du administrerer flere domæner, er det billigere i det lange løb at starte på Core 2-niveau og opgradere, hvis I rammer rate-grænsen, end at gætte jer til et for stort abonnement fra start. De fleste mindre virksomheder med under 100 ansatte rammer sjældent grænsen på 50 forespørgsler i minuttet i normal drift.
En simpel webhook-notifikation kan tilføjes med få linjer, hvis du allerede bruger Slack til interne alarmer. Her er et minimalt eksempel på, hvordan du sender en besked, hvis scriptet finder et nyt fund:
def notify_slack(message: str, webhook_url: str) -> None:
requests.post(webhook_url, json={"text": message}, timeout=10)
# Eksempel på brug inde i check_password-kaldet:
# if hits:
# notify_slack(f"Fundet {hits:,} gange i databrud", webhook_url)
Gem webhook-URL’en som en miljøvariabel i stedet for at skrive den direkte i koden, så den ikke ender i et offentligt Git-repository, hvis du senere deler scriptet med kolleger.
Oversigt: HIBP, Mozilla Monitor og indbyggede browser-advarsler
Med flere metoder gennemgået i guiden kan det være svært at vælge, hvor du skal starte. Her er en kort sammenligning af de værktøjer, vi har dækket, så du kan vælge ud fra hvor meget tid du vil investere, og om du tjekker for dig selv eller for en hel organisation:
| Tjeneste | Pris | Kræver konto | Bedst til |
|---|---|---|---|
| Have I Been Pwned (web) | Gratis | Nej for enkeltopslag | Hurtigt engangstjek af e-mail eller kode |
| Pwned Passwords API | Gratis, ingen nøgle | Nej | Eget script eller intern AD-kontrol |
| Mozilla Monitor | Gratis (basis) | Ja, Mozilla-konto | Løbende overvågning af flere e-mailadresser |
| Browserens password manager | Gratis (indbygget) | Allerede logget ind | Passivt sikkerhedsnet uden ekstra opsætning |
| HIBP domæne-API | Fra 21,59 USD/md | Ja, betalt abonnement | Virksomheder med GDPR-forpligtelser |
For de fleste private brugere er kombinationen af et manuelt e-mailtjek på selve HIBP-siden og dit eget Python-script til adgangskoder nok. Først når du har ansvar for andres data, flere domæner eller en lovpligtig 72-timers-frist at holde, giver det mening at betale for domæneovervågning.
Ofte stillede spørgsmål
Er det sikkert at indtaste min adgangskode på haveibeenpwned.com?
Ja. Opslaget på siden kører k-anonymity-modellen direkte i din browser, så kun et hash-præfiks på 5 tegn sendes til serveren, aldrig den fulde adgangskode eller den fulde hash.
Kræver Have I Been Pwned, at jeg opretter en konto?
Nej, hverken til et e-mailopslag eller et adgangskodeopslag. Du skal kun bekræfte din e-mail via et verifikationslink, hvis du vil have løbende overvågning i stedet for et enkelt tjek.
Er Pwned Passwords API’en gratis at bruge i mit eget script?
Ja. Den kræver ingen API-nøgle og er ikke rate-begrænset på en måde, der er tænkt til at blokere normal brug. Kun domæneovervågning af e-mailadresser kræver et betalt abonnement.
Hvad gør jeg, hvis min e-mail er lækket, men den tilknyttede adgangskode ikke virker længere?
Det er et godt tegn, men tjek stadig om du har genbrugt samme kode på andre konti med samme eller en lignende e-mailadresse, og aktivér to-faktor-godkendelse på kontoen, hvis det ikke allerede er gjort.
Hvor ofte bør jeg tjekke for nye databrud?
En gang om måneden er rimeligt for private brugere. Sæt scriptet fra trin 9 til at køre automatisk, så du ikke skal huske det selv.
Kan virksomheder overvåge deres domæne gratis?
Nej, domæneovervågning af samtlige medarbejderes e-mailadresser kræver et betalt HIBP-abonnement fra Core 2-niveau og op. Den gratis adgang gælder kun enkeltopslag og Pwned Passwords-API’en.
Hvad er forskellen mellem Have I Been Pwned og Mozilla Monitor?
Mozilla Monitor bruger HIBP’s database i baggrunden, men tilføjer et dashboard med anbefalede handlinger for hvert fund og mulighed for at overvåge flere adresser samlet under én Mozilla-konto.
Betyder “ingen match” at min konto er 100% sikker?
Nej. Det betyder kun, at din e-mail eller adgangskode ikke er fundet i et af de 1.022 kendte, registrerede brud i databasen i dag. Nye brud opdages løbende, og ikke alle brud bliver offentligt kendt, især ikke dem der stadig cirkulerer uopdaget i kriminelle fora.
Kan jeg bruge det samme script til at tjekke flere familiemedlemmers adgangskoder?
Ja, men lad hver person køre scriptet selv med deres egen kode via getpass, i stedet for at du samler alles koder i én delt fil. Det begrænser, hvor mange mennesker der reelt har adgang til andres hemmeligheder, selv midlertidigt.




