Ga naar hoofdinhoud

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:

Wachtwoordsha256
welkom1232a5c5f2623024ce3…
welkom124b4514acd68f0dc54…
Welkom1237bca025eff4fb877…

Aan de hash zie je dus niet of twee wachtwoorden op elkaar lijken.

Controlevraag
In een gelekte lijst met sha256-codes staat bij Tim een code die op het eerste en laatste teken na gelijk is aan de code van welkom123. Wat weet je dan over het wachtwoord van Tim?
Kies wat jij denkt. Bij het goede antwoord zie je de uitleg.

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.