Att välja bättre lösenord med passfraser
Av Erik Zalitis.
Skriven: 2019-08-26.
2012 skrev jag ett inlägg om säkra lösenord och diskuterade hur de borde användas. Det har hänt en del sen dess och numera är vi långsamt påväg att lämna lösenorden för säkrare sätt att autentisera oss. Men vi är inte där på långa vägar, så frågan om lösenord kvarstår. Hur väljer man säkra sådana?
I originaltexten skrev jag att man kan skikta lösenorden och ha regler för vilka som fick återanvändas och vilka som måste vara unika. Detta råd är helt förlegat. Nu gäller det att ha en vettig lösenordshanterare som låter dig generera starka lösenord för varje tjänst.
Men om du måste använda manuella lösenord, kommer här vad du behöver tänka på.
Ta fram en mening som inte är direkt möjlig att koppla till dig, din familj eller ting du har i din närhet. Solen skiner och jag är glad låter bra och går lätt att trycka ihop till SolenskinerOchJagEGlad. Notera att jag konverterade bort mellanslagen och de svenska tecknen. Om ditt system stöder Svenska tecken kan du öka säkerheten genom att använda dem. Det är tyvärr många system som inte funkar med tecken som åäöÅÄÖ.
Det är viktigt att ha MINST fyra ord i varje lösenord du genererar på detta sätt. Och antalet tecken måste överstiga 12.
Matematiken bakom
Vettigt byggda system lagrar lösenordsuppgifter som så kallade hashar. Dessa kan ses som ”fingeravtryck” av en lösenord. Man kan inte få tillbaka lösenordet från en hash, däremot kan man utnyttja testa lösenord tills man får fram samma hash och då vet man lösenordet. En komplicerat lösenord är oftare än många anar värdelöst. Lösenordet Sommar11 är lättare att knäcka än Ad21cTG4, men detta beror på hur man försöker gissa lösenordet.
Två saker avgör svårigheten i att gissa ett lösenord: entropin och längden på lösenordet. Entropin i detta fall är antalet möjliga tecken per position i lösenordet. Tänk dig att vi vet ett av lösenorden i listan på lösenords-hashar som vi vill knäcka och att det är Ad21cTG4. Där kan man gissa att systemet som genererat det har gett varje position en slumpmässigt vald siffra, stor eller liten bokstav. Det är rimligt att anta att det handlar om bokstäver från A-Z, a-z (26 små bokstäver + 26 stora bokstäver) och nummer mellan 0-9. Det innebär att entropin är 26+26+10=62 möjliga tecken per position.
Vi gör ännu en djärv gissning: lösenorden är automatiskt genererade och alla har samma längd. Dessutom verkar inte användaren tvingas att byta det direkt, eftersom det lösenord vi redan har verkar vara genererat av en dator och inte en människa. Det kan vara fel, men hackare måste lära sig göra rimliga gissningar.
Längden för lösenordet är som sagt 8 tecken, så kan man ju tro att antalet möjliga lösenord är 62 * 8 = 496. Om nu så vore fallet skulle lösenord inte gå att använda överhuvudtaget. 496 möjliga kombinationer är trivialt att knäcka. I verkligheten är det lite knepigare att beräkna antalet möjliga kombinationer: n!/k! * (n-k)!, där n är antal möjliga tecken och k är lösenordets längd. 1)
”!” inom matematiken kallas fakultet och innebär förenklat att man multiplicerar alla heltal från 1 till och med talet självt. För att ta ett exempel: 6! blir då 12345*6.
Mer om begreppet ”Fakultet”:
http://sv.wikipedia.org/wiki/Fakultet_%28matematik%29
Vi har 62 möjliga kombinationer (entropin) gånger 8 tecken, så:
62!/(8!*(62-8)!) = 3381098545 (3,381098545 x 10^9) möjliga kombinationer.
Tyvärr är detta också helt fel, då det antar att varje tecken bara få användas en gång och att ordningen av positioner är ointressant. Ad21cTG4 skulle då vara exakt samma lösenord som dA21cT4G, vilket är väldigt osannolikt.
Lösningen är att använda en formel för att räkna permutationer istället. Detta funkar som en formel för kombinationer, men räknar som att tecknens placering i lösenordet är relevanta. Vår valda formel tillåter att alla tecken i entropirymden får användas mer än en gång i samma lösenord.
Goda nyheter, den är betydligt enklare än den förra formeln:
n upphöjt till k
62 upphöjt till 8 = 218340105584896 (2,18340105584896 x 10^14) möjliga kombinationer.
Varför detta krånglande kan man tycka? Min poäng var att poängtera att inte glömma detta med att ett lösenord måste ha en viss ordning för att vara unik, när man räknar på lösenordsstyrka och att jag vill poängtera att ordet ”kombinationer” är felaktigt att använda om lösenord. Det heter ”antalet möjliga permutationer” och inte ”antalet möjliga kombinationer”.
Nu kommer den sista delen av sifferjonglerandet, där jag ska visa att ett 14 tecken långt lösenord inte ger dubbelt så många kombinationer som ett sju tecken långt.
Entropi: a-ZA-Z0-9
Antal tecken (k) | Möjliga lösenord (permutationer) (n upphöjt till k) |
1 | 62 |
2 | 3844 |
3 | 238 328 (238 tusen) |
4 | 14 776 336 (15 miljoner) |
5 | 916 132 832 (nästan en miljard) |
6 | 56 800 235 584 (57 miljarder) |
7 | 3 521 614 606 208 (3,5 tusen miljarder) |
8 | 218 340 105 584 896 (218 tusen miljarder) |
9 | 13 537 086 546 263 552 (13 tusen tusen miljarder) |
(…)
14 | 12 401 769 434 657 526 912 139 264 |
I detta fall har ett 14 tecken långt lösenord 3 521 614 606 208 (3,5 tusen miljarder) fler kombinationer än ett 7 tecken långt. Man kan ju tycka att ett 7 tecken långt lösenord med denna entropi är omöjligt att knäcka. 3,5 tusen miljarder möjliga lösenord kan tyckas vara extremt, men det finns en faktor kvar och det är hur många lösenord man kan testa i sekunden. Wikipedian ger oss något att jobba med: “For some kinds of password hash, ordinary desktop computers can test over a hundred million passwords per second using password cracking tools running on a general purpose CPU(…)”. 2) Låt oss anta att detta stämmer i vårt fall och din helt splitternya PC hanterar 100 miljoner lösenord-gissningar i sekunden. Då får du fram:
3521614606208 / 100 000 000 = 35216 sekunder (avrundat) = 9,8 timmar.
Tydligen är detta ett bevis på att sju tecken inte är på långa vägar tillräckligt. Hur funkar det med 14 tecken då?`
12401769434657526912139264 / 100 000 000 = 1,2401769*10^17 sekunder (avrundat) = 3932 575 290 = drygt 3,9 miljarder år.
Det finns idag extremt kraftfulla beräkningskluster (ungefär en stor samling ihopkopplade datorer som delar upp beräkningarna mellan sig) som kan gissa långt fler än 100 miljoner lösenord per sekund. Men problemet kvarstår, det handlar om så pass långa tidsrymder att det troligen inte är möjligt att knäcka inom rimlig tid.
1) https://betterexplained.com/articles/easy-permutations-and-combinations/
2) http://en.wikipedia.org/wiki/Password_cracking
Hur attackerar man ett lösenord i verkligheten?
SolenskinerOchJagEGlad har fler än 14 tecken, vilket betyder att ni som kör Windows-burkar inte lagrar lösenordet med hjälp av den knäckta LanManager-algoritmen som lagrar lösenordet som två 7-teckens lösenord och inte skiljer mellan stora och små bokstäver. Ni förstår säkert nu hur illa detta är med tanke på vad vi just gått igenom.
Brute force
Alla formlerna ovan har visat hur svårt det är att gissa riktigt långa lösenord med hög entropi. Brute force testar alla möjliga permutationer upp till ett visst antal tecken med en förinställd entropi. På riktigt långa lösenord är brute force inte särskilt användbart.
Ordliste-attack
Ordliste-attacker testar ord och kombinationer av ord från ordlistor. Den lägger normalt även till siffror, så kombinationen Sommar11 är lätt att knäcka med en ordliste-attack.
Dock har dessa attacker problem med lösenord som innehåller fyra ord eller fler. Särskilt som att du nu har ändrat delar av orden till siffror.
Rainbowtables
En bra teknik för att snabba upp knäckandet är att förberäkna och skapa en databas med möjliga hashar för en lösenordslängd och entropi. Då behöver du bara slå upp din hash och kan då få svar mycket snabbare. Problemet är att dessa databaser snabbt blir stora och tar tid att bygga. De finns förberäknade databaser att köpa eller ladda ner gratis. När lösenorden närmar sig 20 tecken eller mer, är de flesta inte användbara längre.
Hybridattacker
Här finns nog den bästa möjligheten. Genom att blanda ordlistor med brute force kanske det är möjligt. Men jag ställer mig tvekande till att SolenSkinerOchJagEGlad är möjligt att knäcka inom rimlig tid. Tänk också på att det är en stor skillnad mellan ”offline-attacker” där du har en ”oändlig tid” på dig att testa och online-attacker som är svåra att hinna med innan kontot spärras eller någon skyddsfunktion träder in.
Läs vidare
http://sv.wikipedia.org/wiki/Permutation
http://sv.wikipedia.org/wiki/Kombination_%28matematik%29