Ga naar hoofdinhoud

Wachtwoorden: traag is goed

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, meten.py, 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")
  1. Regel 6:

    Een PasswordHasher rekent Argon2-hashes uit. In les 7 gebruik je hem in je server.

  2. Regel 8:

    time.perf_counter() geeft een tijd in seconden. Het verschil tussen begin en eind is hoe lang de loop duurde.

  3. Regel 12:

    :.0f schrijft het getal zonder cijfers achter de komma.

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 5000 veelgebruikte wachtwoorden wil proberen, merkt het wel. Met de getallen hierboven kost dat met sha256 een paar duizendste seconde, en met Argon2 ruim vier minuten, voor elke gebruiker opnieuw. Bij duizend gebruikers is dat ruim drie dagen.

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 daarmee omgaan, zie je in les 12.

Controlevraag
Je server gebruikt straks Argon2. Merkt een gebruiker dat als hij inlogt?
Kies wat jij denkt. Bij het goede antwoord zie je de uitleg.

Er gaat iets mis​

No module named 'argon2'​

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 - Hoeveel keer trager?​

Neem de twee getallen die meten.py bij jou printte. 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 7: registreren met Argon2.