
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