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?
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.
Die Passwörter werden also wie folgt gespeichert:
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:
Meist wird für jedes Passwort ein zufälliger salt-Wert erzeugt und mit in der Datenbank abgespeichert.
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)
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 Stringpassword
ein Bytes-Objekthashlib.md5(bytes)
– wendet den md5-Hash auf das Bytes-Objekt anhash.hexdigest()
– stellt den Hash in der Hexadezimaldarstellung dar