Passwort-Hashing

Feb 08 2023
Die Angriffsfläche von Passwörtern
Einige der verheerendsten Angriffe auf die Cybersicherheit entstehen durch die Verletzung von Passwörtern, die schlecht in serverseitigen Datenbanken gespeichert sind. Das Problem könnte beim Benutzer beginnen, der möglicherweise dazu neigt, ein einfaches und einprägsames Passwort festzulegen.
Foto von Michael Dziedzic auf Unsplash

Einige der verheerendsten Angriffe auf die Cybersicherheit entstehen durch die Verletzung von Passwörtern, die schlecht in serverseitigen Datenbanken gespeichert sind.

Das Problem könnte beim Benutzer beginnen, der möglicherweise dazu neigt, ein einfaches und einprägsames Passwort festzulegen. Dies stellt ein Risiko dar, da es von Angreifern leicht erraten werden kann, wenn sie den Kontext der Person verstehen, beispielsweise Namen von Haustieren oder Verwandten.

Selbst wenn ein komplizierteres Passwort gewählt wird, kann eine Passwort-Cracker-Software einen Brute-Force-Angriff auslösen, der dazu führt, dass eine große Anzahl von Passwörtern bis zum Erfolg ausprobiert wird.

Ein weiterer Angriffsvektor ist der Zugriff auf die Datenbank, in der Anmeldeinformationen gespeichert sind. Im alptraumhaften Szenario eines CISO könnten Tausende von Benutzerkonten sofort kompromittiert werden, wenn ein Angreifer Zugriff auf eine Datenbank mit unverschlüsselten Klartext-Passwörtern erhält. Dies ist leider allzu oft vorgekommen – und betrifft sowohl kleine als auch große Organisationen.

Keine Angst, diese nervenaufreibenden Aussichten können durch etwas namens Passwort-Hashing eingeschränkt werden!

Foto von Markus Spiske auf Unsplash

Hashing definieren

Passwort-Hashing ist eine kryptografische algorithmische Technik, die Klartext verwendet, eine komplizierte Hash-Funktion ausführt und gehashten Text erzeugt. Der Schlüssel zu diesem Verfahren liegt in der Funktion, aber nicht alle sind gleichermaßen geeignet, Risse zu verhindern.

Alle Funktionen müssen zwei Schlüsseleigenschaften erfüllen, um die Kriterien von OWASP (The Open Source Web Application Security Project) zu erfüllen:

Es ist schwierig, einen ersten Input zu erstellen, der einem bestimmten gewünschten Output entspricht.

Um dieses Merkmal zu veranschaulichen, lautet der Hash von „Passwort“, der durch den beliebten kryptografischen Algorithmus sha256 generiert wird:

e7cf3ef4f17c3999a94f2c6f612e8a888e5b1026878e4e19398b23bd38ec221a

Und der Hash von „Passwort“ ist:

5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8

Wie Sie sehen, führt die bloße Änderung der Groß- und Kleinschreibung eines Buchstabens der Eingabe zu einer deutlich anderen Ausgabe, was bedeutet, dass die Ausgaben nicht einfach aus den Eingaben ermittelt werden können.

Es ist praktisch, den Hash zu erzeugen, aber praktisch unmöglich, die Eingabe neu zu generieren, wenn nur der Hash-Wert bekannt ist.

Im Gegensatz zur Verschlüsselung, bei der ein Klartext-Passwort in verschlüsselten Text umgewandelt wird, bevor es wieder in Klartext entschlüsselt wird, ist Hashing eine Möglichkeit. Da Passwort-Hashing deterministisch ist, erzeugt die gleiche Eingabe immer die gleiche Ausgabe.

Der Anwendungsfall hierfür besteht darin, dass ein Benutzer ein Passwort erstellt, dieses gehasht werden kann und die Ausgabe dann in einer Datenbank gespeichert wird. Wenn der Benutzer sein Passwort erneut versucht, wird es erneut gehasht und dann anhand des Hashs in der Datenbank überprüft. Wenn ein Angreifer Zugriff auf die Hash-Datenbank erhält, ist dieser weitgehend nutzlos, da Passwörter nicht wieder in Klartext umgewandelt werden können.

Versuchen Sie, dieses Python-Skript auszuführen, um eine einfache Version dieses Konzepts zu sehen :

# this and other fun scripts can be found at: https://github.com/Jay-Gokani

# install sha256 library for hashing
from hashlib import sha256

# demo explanation
print ('Hello, this demo will ask for a plaintext password, hash it and will verify the hash for access requests')

# first hash stored as a variable
hash1 = (sha256(input('What phony password would you like to set? ').encode('utf-8'))).hexdigest()
print('The hash of your plaintext password is:', hash1)

# password hash stored confirmation
print ('Your password hash has been successfully stored.')

# promt the user for password re-entry, hash and store as another variable
hash2 = (sha256(input('I will test your hash. Please type your password: ').encode('utf-8'))).hexdigest()
print('The hash of your plaintext password is:', hash2)

# access approval or deny check
while True:
    if hash1 == hash2:
        print('Success - password hash matches.')
        break
    else:
        print('The password hash does not match. Please run the programme again.')
        break

Hashes sind natürlich keine All-in-One-Lösung, um kompromittierte Passwörter zu verhindern. Angreifer können beispielsweise Listen gängiger Passwörter und der entsprechenden Hashes erstellen. Wenn irgendwelche Hashes in der Datenbank auf der Liste stehen, kennt der Angreifer das Klartext-Passwort. Dies sollte jedoch kein Problem darstellen, wenn Klartext-Passwörter mit ausreichender Komplexität erstellt werden. Darüber hinaus könnte die Anwendung, die Klartext-Passwörter aufnimmt, um Hashes zu erzeugen, abgefangen werden.

Passwort-Hashing ist ein großer Schritt in die richtige Richtung! Wir hoffen, dass Ihnen dieser Artikel gefallen hat :-)