Door majortom: Als voorbeeld: als een site MD5 als hashing algoritme zou gebruiken (ik mag niet hopen dat er nog zulke sites zijn, maar het zou me niet verbazen), dan maakt de keuze van het wachtwoord niet veel meer uit aangezien de kans op collision bij dit algoritme zo groot is dat er gemakkelijk (middels een heel ander wachtwoord dan de door jou ingestelde) toegang zou kunnen worden verkregen.
Het advies om bepaalde eenweg-algoritmes
niet te gebruiken voor het hashen van wachtwoorden op servers:
• heeft
niets te maken met collissions,
én het
• heeft
niets te maken met dat MD5 "gekraakt" is,
én het
• heeft überhaupt
niets met cryptografie te maken,
máár het
• heeft
alles te maken met dat mensen voorspelbare (incl. te korte) wachtwoorden gebruiken.
Hét
grootste probleem hier is dat de meeste mensen wachtwoorden gebruiken die ooit in een "wachtwoorden-woordenboek" (password-
dictionary) zijn terechtgekomen. Zodra criminelen een database met gehashte wachtwoorden in handen krijgen, hangt hun aapak er vanaf of er (per account) een platte-tekst
salt (een random getal of reeks alfanummerieke karakters) is opgeslagen.
Een
gevolg-probleem is dat op snelheid geoptimaliseerde software die hashes berekent
bloedsnel is, vooral op moderne grafische kaarten. Het is dus onverstandig om
welke snelle hashfunctie dan ook in te zetten voor "éénweg afgeleiden" van wachtwoorden.
Zonder salt
Als zij deze nog niet hebben genereren de criminelen een
rainbow-table voor het in de wachtwoord-database gebruikte hash-algoritme. Dat doen zij door van elk wachtwoord in bijvoorbeeld deze [1] 1000 password-
dictionary de hash te berekenen, en vervolgens de output (hash) en input (wachtwoord) in een tabel te zetten.
[1]
https://www.secureworks.com/-/media/images/insights/blog/lazy-passwords-become-rocket-fuel-for-emotet-smb-spreader/unredactedtable.pdf. Nb. in de praktijk worden gigantisch grotere password-dictionaries gebruikt, zie bijv.
https://weakpass.com).
Indien de gehackte server MD5 gebruikte, dan begint die tabel mogelijk als volgt:
MD5 | password
4a7d1ed414474e4033ac29ccb8653d9b | 0000
38b05a6ea700fa6774e8aee14f6704eb | alison
b1f4f9a523e36fd969f4573e25af4540 | cool
0eb55bec7f0e6d1c831bfbef77ac054a | hobbes
dbe9454e9d8631d841c29589ad155186 | naughty
9d2f75377ac0ab991d40c91fd27e52fd | shannon
[...] | [...]
Vervolgens halen zij, één voor één, de hashes uit de gekopiejatte account-database en kijken of diezelfde hash vóórkomt in hun rainbow-table. Zo niet: helaas pindakaas, volgende proberen. Zo ja: wachtwoord bekend (en volgende proberen).
Voor elk "gereversed" wachtwoord zoeken de criminelen het e-mailadres van het slachtoffer erbij en kijken of zij daarmee, plus gevonden wachtwoord, ook op accounts op
andere servers kunnen inloggen.
Nb. in theorie kunnen zo
hash-collisions gevonden worden. In de praktijk is dat een broodje-aap-verhaal, want de kans dat twee verschillende wachtwoorden dezelfde MD5 opleveren is ruwweg 1 : 2^128 (dus 1 : meer dan 3 gevolgd door 38 nullen en bovendien is de kans ca. 0 dat het daarbij om twee realistische passwords gaat: zie de tabellen in
https://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities).
Met unieke salt voor elk account
Een rainbow table heeft geen zin in dit geval. Echter, moderne grafische kaarten worden steeds sneller in het berekenen van hashes.
In dit geval halen de criminelen ook, één voor één, de hashes en bijbehorende salts uit de gekopiejatte account-database. Maar nu voeren zij die inputs aan
hashcat - die als derde input de gekozen dictionary gebruikt (voor hoe het verder gaat zie onder "zonder salt").
Effectief moet je dus, per account (hash + salt) dezelfde berekeningen doen
alsof je een rainbow table zou maken (in zoverre, bij een "hit" ben je eerder klaar).
Leuk, maar dat kost natuurlijk jaren. Of niet? Uit
https://gist.github.com/Chick3nman/09bac0775e6393468c2925c1e1363d5c (ingekort, afgerond en vereenvoudigd door mij):
GH/s algoritme
221 MD5
220 md5($pass.$salt)
118 md5($salt.$pass)
70 SHA1
70 sha1($pass.$salt)
54 sha1($salt.$pass)
28 SHA2-256
28 sha256($pass.$salt)
26 sha256($salt.$pass)
10 SHA2-512
10 sha512($pass.$salt)
10 sha512($salt.$pass)
Merk op: G (Giga) is 1.000.000.000.
Ter vergelijking (H/s i.p.v. GH/s):
H/s algoritme
7760 scrypt
1 Ethereum Wallet, (aangepaste) SCRYPT
Oftewel, bij MD5 met salt kun je, orde grootte, 10^11 hashes/seconde berekenen. Bij SHA-512 is dat 10^10. Bij dergelijke snelheden zet dat geen zoden aan de dijk.
Je kunt alleen
significant afremmen door bewust traaggemaakte eenwegfuncties (zoals script en Argon2) te gebruiken. Daarbij moet voorkómen worden dat softwarematige-optimalisatie mogelijk is: in de praktijk betekent dit dat zulke routines CPU-performance en/of geheugen moeten vreten. Maar
dáár hebben servereigenaren een bloedhekel aan, want
dat kost hén geld.
CONCLUSIE
Ik blijf het herhalen: gebruik
UNIEKE (per account van jou) en zo lang mogelijke
STERK RANDOM GEGENEREERDE wachtwoorden met zoveel mogelijk "entropie" (zoveel mogelijk toegestane tekens).
Voor jouw eigen accounts-veiligheid. En gebruik een wachtwoordmanager die op domeinnamen checkt - om de meeste vormen van phishing uit te sluiten. Een goede wachtwoordmanager zal ook prima random wachtwoorden kunnen genereren.
Nb. bij wachtwoordzinnen en voorspelbare randomness is de kans groter dat deze ooit gebruikt, gelekt en in een password-dictionary zijn opgenomen.