Wachtwoorden: wat een hash is
In les 2 stond elk wachtwoord leesbaar in de database. Dat los je op door niet het wachtwoord zelf te bewaren, maar een hash ervan. Hier reken je je eerste hash uit, nog zonder server.
Een hash uitrekenen
Een hash is een berekening die van tekst een lange code maakt. Python
heeft er een ingebouwd, sha256. Zet dit in een scriptje maak_hash.py:
import hashlib
wachtwoord = "welkom123"
print(hashlib.sha256(wachtwoord.encode()).hexdigest())
.encode() maakt van de tekst bytes, want daar rekent sha256 mee, en
.hexdigest() schrijft de uitkomst als tekst van cijfers en de letters a tot
en met f.
Drie eigenschappen
Eenrichtingsverkeer. Van een wachtwoord naar een hash is één regel code. Van een hash terug naar het wachtwoord bestaat geen berekening. Daarom kun je een hash bewaren: wie hem ziet, kan hem niet omrekenen.
Hetzelfde erin, hetzelfde eruit. welkom123 geeft elke keer precies
dezelfde hash. Zo kun je bij het inloggen controleren of iemand het goede
wachtwoord typt: bereken de hash van wat hij intypt, en vergelijk die met de
opgeslagen hash.
Een klein verschil, een heel andere hash. Eén letter anders is een compleet andere code:
| Wachtwoord | sha256 |
|---|---|
welkom123 | 2a5c5f2623024ce3… |
welkom124 | b4514acd68f0dc54… |
Welkom123 | 7bca025eff4fb877… |
Aan de hash zie je dus niet of twee wachtwoorden op elkaar lijken.
Er gaat iets mis
Strings must be encoded before hashing
import hashlib
hashlib.sha256("welkom123").hexdigest()
Uitvoer:
TypeError: Strings must be encoded before hashing
Oorzaak: sha256 rekent met bytes, niet met tekst.
Oplossing: zet .encode() achter de tekst: "welkom123".encode().
Opdrachten
Opdracht 1: Run - Je eigen hash
Bereken de sha256-hash van je eigen naam. Verander daarna één letter en
bereken hem opnieuw. Hoeveel tekens van de twee hashes zijn gelijk?
Antwoord
Bijna geen: hooguit een paar tekens komen toevallig overeen, op willekeurige plekken. Eén letter verschil in de invoer geeft een heel andere hash.
Door naar les 4: een hash in je server.