Wachtwoorden: traag is goed
Hier bouw je op verder
- Python Modules importeren
Met een hash en een zout kan niemand het wachtwoord meer terugrekenen. Maar een aanvaller met de database kan nog wel proberen: een veelgebruikt wachtwoord nemen, de hash uitrekenen met het zout van een gebruiker, en kijken of die klopt. Hoe sneller de hash, hoe meer pogingen per seconde.
sha256 is gemaakt om snel te zijn: handig voor het controleren van bestanden,
maar voor wachtwoorden juist een nadeel. Voor wachtwoorden bestaan hashes die
expres traag zijn, zoals Argon2. Installeer hem met
python -m pip install argon2-cffi.
Meet het zelf
Dit script rekent eerst honderdduizend sha256-hashes uit, en daarna twintig
Argon2-hashes, en zegt hoeveel er per seconde lukken:
import hashlib
import time
from argon2 import PasswordHasher
ph = PasswordHasher()
begin = time.perf_counter()
for i in range(100000):
hashlib.sha256(f"poging{i}".encode()).hexdigest()
duur = time.perf_counter() - begin
print(f"sha256: {100000 / duur:.0f} per seconde")
begin = time.perf_counter()
for i in range(20):
ph.hash(f"poging{i}")
duur = time.perf_counter() - begin
print(f"argon2: {20 / duur:.0f} per seconde")
- Regel 6:
Een
PasswordHasherrekent Argon2-hashes uit. In les 5 gebruik je hem in je server. - Regel 8:
time.perf_counter()geeft een tijd in seconden. Het verschil tussen begin en eind is hoe lang de loop duurde. - Regel 12:
:.0fschrijft het getal zonder cijfers achter de komma.
Op de computer waarop deze les is getest, gaf dat:
sha256: 2194629 per seconde
argon2: 19 per seconde
Jouw getallen zijn anders, want elke computer is anders snel. Maar het verschil is steeds enorm: tienduizenden tot honderdduizenden keren.
Waarom dat jou niet hindert
Je server rekent één hash uit als iemand inlogt. Of dat een miljoenste of een
twintigste seconde duurt, merkt de gebruiker niet. Wie de database heeft
gestolen en per gebruiker duizenden wachtwoorden wil proberen, merkt het wel:
wat met sha256 een fractie van een seconde kost, duurt met Argon2 uren.
Een trage hash beschermt niet tegen alles. Een wachtwoord als welkom123 staat
in elke lijst met veelgebruikte wachtwoorden en blijft zwak, hoe traag de hash
ook is. Hoe sites daar mee omgaan, zie je in les 8.
Er gaat iets mis
ModuleNotFoundError: No module named 'argon2'
Oorzaak: Argon2 is niet geïnstalleerd, of in een andere omgeving dan de Python waarmee je het script draait.
Oplossing: installeer hem in de terminal van VS Code met
python -m pip install argon2-cffi. Let op: je installeert argon2-cffi,
maar je importeert argon2.
Opdrachten
Opdracht 1: Run
Draai het script. Deel het getal van sha256 door dat van Argon2. Hoeveel
keer trager is Argon2 op jouw computer?
Antwoord
Op de testcomputer is dat 2194629 gedeeld door 19, ongeveer 115 000 keer. Bij jou komt er een ander getal uit, maar in dezelfde orde: tienduizenden tot honderdduizenden keren.
Opdracht 2: Investigate - Een miljoen pogingen
Hoe lang duren een miljoen hashes met jouw getallen, met sha256 en met
Argon2?
Tip
Deel een miljoen door het aantal per seconde. Voor Argon2 kun je de seconden daarna delen door 3600 om uren te krijgen.
Antwoord
Met de getallen van de testcomputer: sha256 een miljoen gedeeld door
2194629, bijna een halve seconde. Argon2 een miljoen gedeeld door 19, ruim
52 000 seconden: meer dan veertien uur. Jouw getallen geven andere tijden,
maar het verschil blijft ongeveer even groot: een fractie van een seconde
tegenover uren. En dat is voor één gebruiker, want
door het zout begint het rekenen bij elke gebruiker opnieuw.
Door naar les 5: registreren met Argon2.