Waarom niet gewoon SHA-256?

Een gewone cryptografische hash als is het juiste gereedschap voor integriteit, maar het verkeerde gereedschap om wachtwoorden op te slaan, en de reden is juist de eigenschap die hem elders goed maakt: hij is snel. Een aanvaller die een database met SHA-256-wachtwoordhashes steelt, kan op gewone hardware miljarden gokken per seconde proberen, omdat elke gok slechts één snelle hash is. Veelgebruikte wachtwoorden vallen vrijwel onmiddellijk. Snelheid, de deugd van een hash voor algemeen gebruik, is hier een nadeel.

Wachtwoordopslag vereist een hash die opzettelijk traag is en bestand tegen gespecialiseerde hardware. Drie bouwstenen maken dat mogelijk: salten, een instelbare werkfactor en geheugenhardheid.

Salten: voorberekening verslaan

Een salt is een unieke willekeurige waarde die naast elke wachtwoordhash wordt opgeslagen en in het hashen wordt meegemengd. Zonder salts produceren identieke wachtwoorden identieke hashes, dus een aanvaller kan eenmalig een reusachtige tabel met hashes van veelgebruikte wachtwoorden voorberekenen (een "rainbow table") en elke overeenkomst ogenblikkelijk opzoeken. Een unieke salt per wachtwoord maakt die voorberekening waardeloos: de aanvaller moet elke hash afzonderlijk aanvallen, en hetzelfde wachtwoord hasht anders voor elke gebruiker. Moderne wachtwoord-hashfuncties genereren en bewaren de salt voor je.

Werkfactor: elke gok duur maken

Een werkfactor (of kostenparameter) bepaalt hoeveel rekenwerk elke hash kost. Stel hem zo in dat één hash traag genoeg is om onmerkbaar te zijn bij een legitieme aanmelding (een paar honderd milliseconden) maar bestraffend op schaal. Omdat het een parameter is, kun je hem in de loop der jaren verhogen naarmate hardware sneller wordt, waarmee de kosten van gokken ongeveer constant blijven. Dit is de knop die een hash voor algemeen gebruik simpelweg niet heeft.

De drie standaardkeuzes

  • bcrypt is de langbestaande, goed begrepen optie, gebouwd op het Blowfish-cijfer met een instelbare kostenfactor. Een veilige standaard waar beschikbaar.
  • scrypt voegt geheugenhardheid toe: het verbruikt opzettelijk een instelbare hoeveelheid geheugen, wat aanvallers met GPU's en speciale chips afremt, aangezien die rekenwerk veel goedkoper opschalen dan geheugen.
  • Argon2 won de Password Hashing Competition in 2015 en is de huidige aanbeveling voor nieuwe systemen. Het is geheugenhard met aparte knoppen voor geheugen, tijd en parallellisme; de variant Argon2id is de gebruikelijke keuze.

Elk hiervan is een redelijke keuze; de hoofdregel is een ervan te gebruiken, nooit een kale snelle hash, en nooit je eigen schema te bedenken.

De les

Gebruik SHA-256 (in de Hash-tool) voor controlegetallen en integriteit, waar snelheid een pluspunt is. Voor wachtwoorden grijp je naar bcrypt, scrypt of Argon2, waar traagheid en geheugenkosten het hele punt zijn. De twee taken lijken op elkaar en vragen tegenovergestelde gereedschappen.