Ga naar hoofdinhoud

Wachtwoorden: traag is goed

Hier bouw je op verder

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

    Een PasswordHasher rekent Argon2-hashes uit. In les 5 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.

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.