
In der heutigen digitalen Welt ist die Sicherheit von Passwörtern wichtiger denn je. Datenlecks und Passwortdiebstähle sind an der Tagesordnung, und Millionen von Zugangsdaten gelangen regelmäßig in die Hände von Cyberkriminellen. Ein äußerst nützliches Tool zur Überprüfung der Sicherheit von Passwörtern ist die API „api.pwnedpasswords.com“, die von Have I Been Pwned (HIBP) bereitgestellt wird.
Wie funktioniert die API?
Die API verwendet das k-Anonymitätsprinzip, um sicherzustellen, dass das zu prüfende Passwort nicht vollständig offengelegt wird. Der Prozess sieht folgendermaßen aus:
- Der Benutzer oder die Anwendung hashen das zu überprüfende Passwort mit SHA-1.
- Die ersten 5 Zeichen des Hashs werden an die API gesendet.
- Die API antwortet mit einer Liste aller Hashes, die mit diesen ersten 5 Zeichen beginnen und in ihrer Datenbank gefunden wurden.
- Die Anwendung vergleicht den vollständigen Hash des geprüften Passworts mit den zurückgegebenen Hashes.
- Falls eine Übereinstimmung gefunden wird, bedeutet dies, dass das Passwort kompromittiert ist und nicht verwendet werden sollte.
Dieses Verfahren stellt sicher, dass ein vollständiger Passwort-Hash niemals über das Internet übertragen wird, wodurch das Risiko minimiert wird, dass Angreifer sensible Informationen abfangen können.
Wie spreche ich die API per Powershell auf?
Ich habe den Abruf in eine Funktion geschrieben. Dieses hat für mich den Vorteil, dass ich den dann notwendigen Aufruf an mehrern Stellen in Programmierungen verwendne kann.
function Test-PwnedPassword {
param (
[string]$Password
)
# Passwort hashen (SHA-1)
$sha1 = New-Object System.Security.Cryptography.SHA1Managed
$hashBytes = $sha1.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($Password))
$hashString = [BitConverter]::ToString($hashBytes) -replace '-',''
# Ersten fünf Zeichen extrahieren
$prefix = $hashString.Substring(0, 5)
# API-Abfrage
$url = "https://api.pwnedpasswords.com/range/$prefix"
try {
$response = Invoke-WebRequest -Uri $url -UseBasicParsing
$hashes = $response.Content -split "`n"
# Prüfen, ob das vollständige Hash-Suffix in der Liste ist
foreach ($line in $hashes) {
$parts = $line -split ":"
if ($hashString.Substring(5) -eq $parts[0]) {
Write-Output "Das Passwort wurde bereits $($parts[1]) Mal gefunden!"
return
}
}
Write-Output "Das Passwort wurde nicht gefunden."
}
catch {
Write-Output "Fehler bei der API-Anfrage: $_"
}
}
Für den Test des Skriptes kann folgender Test-Aufruf verwendet werden.
$passwort = Read-Host „Geben Sie Ihr Passwort ein“
Test-PwnedPassword -Password $passwort