Hashfunktionen, auch Streuwertfunktion genannt…

  • erzeugen aus einer grossen Definitionsmenge eine kleine Zielmenge
  • sind nicht injektiv
  • Zwei ähnliche aber nicht identische Inputs liefern aber einen anderen Output.

Bekannte Hashfunktionen sind MD5 und SHA.

# Passwörter

Wie soll eine Webseite die Zugangsdaten ihrer Benutzer abspeichern?

Zugangsdaten im Klartext
id username password hint
1 admin 1337 k3wl dud
2 pumpkin22 halloween my favorite holiday
3 johndoe queen Freddie Mercury’s band
4 alexa45 password password
5 guy 123456 NULL
6 maryjane queen I’m one
7 dudson123 halloween scary movie!

# Passwörter hashen

Passwörter werden meist nur «gehasht» gespeichert. Wenn du also irgendwo ein neues Passwort setzt, wird dein Passwort durch eine Hashfunktion geschickt und es wird nur der erzeugte Hashwert abgespeichert. Wenn du dich später wieder anmelden möchtest, gibst du dein Passwort wieder ein. Dieses wird wieder durch die Hashfunktion geschickt und mit dem gespeicherten Hash verglichen. Hat jemand Zugriff auf den Passwort-Speicher, so sieht er dort nur Hashwerte. Somit kann er nicht so einfach dein Passwort rausfinden.

Passwörter durch Hash-Funktion

Die Passwörter werden also wie folgt gespeichert:

Zugangsdaten mit gehashten Passwörtern
id username password hashed hint
1 admin e48e13207341b6bffb7fb1622282247b k3wl dud
2 pumpkin22 a6539c35ec07965956f1de7b3ec36971 my favorite holiday
3 johndoe 72545f3f86fad045a26ed54abd2bbb9f Freddie Mercury’s band
4 alexa45 5f4dcc3b5aa765d61d8327deb882cf99 password
5 guy e10adc3949ba59abbe56e057f20f883e NULL
6 maryjane 72545f3f86fad045a26ed54abd2bbb9f I’m one
7 dudson123 a6539c35ec07965956f1de7b3ec36971 scary movie!

Aufgabe «reicht das?»

Zeige Probleme des oben besprochenen Vorgehens auf!

# Passwörter-Hash salzen

Damit zwei gleiche Passwörter nicht zum selben Hash führen, werden den Passwörtern ein sogenanntes Salz beigefügt:

Passwörter und Salt durch Hashfunktion

Meist wird für jedes Passwort ein zufälliger salt-Wert erzeugt und mit in der Datenbank abgespeichert.

Zugangsdaten mit gesalzenen Passwörtern-Hashes
id username salt password hashed hint
1 admin 130e 15fe4ae1201fa58fdf3fab81ef040e82 k3wl dud
2 pumpkin22 cf5c 36a73d6e5da1effe92c6ad79616a64e0 my favorite holiday
3 johndoe 846d 7c59f436c7b7f8694505af13b287bba1 Freddie Mercury’s band
4 alexa45 e48e 213c171270455f7c25d1b6efd581a111 password
5 guy a6b9 acbd6406cdbad54ee93ab89d1bedf3d1 NULL
6 maryjane 5b66 d249827d01890a030a0241ce669a1f0a I’m one
7 dudson123 0d4b f11eda31fd7467b55deabf628abff9f5 scary movie!

# Aufgabe

«Passwort aus Hash»

Ein Hacker hat eine Liste von md5-gehashted Passwörter gestohlen. Erweitere die Liste häufiger Passwörter und schaue, wie viele Passwörter du herausfinden kannst!

In der Vorlage findest du die Liste der Passwort-Hashes, sowie eine kurze Liste mit Passwörtern. Mit jedem Passwort wird ein Hash erzeugt und dann geschaut ob der Hash in der Liste des Hackers vorkommt:

import hashlib

hashes = [
    "e10adc3949ba59abbe56e057f20f883e",
    "5f4dcc3b5aa765d61d8327deb882cf99",
    "d8578edf8458ce06fbc5bb76a58c5ca4",
    "37b4e2d82900d5e94b8da524fbeb33c0",
    "0192023a7bbd73250516f069df18b500",
    "0b4e7a0e5fe84ad35fb5f95b9ceeac79",
    "098f6bcd4621d373cade4e832627b4f6",
    "40be4e59b9a2a2b5dffb918c0e86b3d7",
    "5badcaf789d3d1d09794d8f021f40f0e",
    "7c6a180b36896a0a8c02787eeafb0e4c",
    "008c5926ca861023c1d2a36653fd88e2",
    "4297f44b13955235245b2497399d7a93",
    "d0763edaa9d9bd2a9516280e9044d885",
    "e99a18c428cb38d5f260853678922e03",
    "df0349ce110b69f03b4def8012ae4970",
    "6b1628b016dff46e6fa35684be6acc96",
    "1a1dc91c907325c69271ddf0c944bc72",
    "912ec803b2ce49e4a541068d495ab570",
    "0d107d09f5bbe40cade3de5c71e9e9b7",
    "8afa847f50a716e64932d995c8e7435a",
    "8621ffdbc5698829397d97767ac13db3",
    "da443a0ad979d5530df38ca1a74e4f80",
    "84d961568a65073a3bcf0eb216b2a576",
    "bb7aedfa61007447dd6efaf9f37641e3"
]

passwords = [
    "test",
    "123"
]

for password in passwords:
    hashed = hashlib.md5(password.encode()).hexdigest()
    if hashed in hashes:
        print("Passwort gefunden:", password)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Zeile 36
password.encode() – erzeugt aus dem String password ein Bytes-Objekt
hashlib.md5(bytes) – wendet den md5-Hash auf das Bytes-Objekt an
hash.hexdigest() – stellt den Hash in der Hexadezimaldarstellung dar
Letzte Änderung: 12.1.2021, 12:17:11