Jag har läst lite om hashing nyligen och enligt AgileBits , de använder ” SHA512 inom PBKDF2 ” i sin nya valvfil.
Jag har letat i Wikipedia efter båda namnen och jag vet att PBKDF2 är en nyckelavledningsfunktion och SHA är en kryptografisk hashfunktion men jag kan inte riktigt förstå skillnaden och varför de båda används tillsammans med varandra.
Kan någon förklara detta för en person utan erfarenhet av kryptografi?
(Du kan anta att jag bara vet om matematik, om det behövs).
Kommentarer
Svar
SHA-512 är en kryptografiskt säker hash , PBKDF2 är vad vi kallar en lösenordsbaserad nyckelavledningsfunktion. Om den resulterande hemligheten inte används som nyckel men som hash-värde kallas den också en lösenordshash . Lösenordshash skiljer sig från säkra hash i den meningen att de innehåller ett salt och en arbetsfaktor / iteration.
Både kryptografiska hash och lösenordshash är envägsfunktioner som är utformade för att skapa en kort, fast utmatning från en givet input. När det gäller lösenordshash skulle ingången vara lösenordet och saltet. Saltets storlek och iterationsantalet anses ofta vara konfigurationsparametrar; båda påverkar naturligtvis utmatningen av lösenordshashen.
Lösenordshash bygger vanligtvis ovanpå Pseudo Random Functions eller PRF. En vanlig form av PRF är en HMAC- eller Hash-baserad Message Authentication Code, som i sin tur använder en hash internt. När hashbaserade PRF: er som HMAC används är typen / storleken på hash som används ofta konfigurerbar. Lösenordshashar behöver dock inte behöva byggas med hash. Alla andra PRF, som de som är baserade på symmetriska siffror, kan göra det. bcrypt är till exempel byggt ovanpå Blowfish, en blockkodning.
Lösenordshash behöver ett salt så att identiska lösenord inte kommer att mappas till samma hash. De förhindrar därför också regnbågstabeller (som innehåller förberäknat lösenord / hashpar) från att vara användbara. Dessutom innehåller de en arbetsfaktor / iterationsräkning så att en angripare behöver utföra mer arbete för att beräkna hash för varje möjligt lösenord. Detta behövs eftersom de flesta lösenord inte är slumpmässiga. Utan arbetsfaktorn angriparen skulle kunna testa stora mängder möjliga lösenord med brute force eller en ordbokattack.
Kommentarer
- mycket mer info här … passar dock inte ’ i svarsutrymmet.
Svar
För att parafrasera mitt svar på en tidigare fråga , PBKDF2 är en allmän algoritm på hög nivå som kallar internt en pseudorandom-funktion (PRF) för att bearbeta inmatningen. PBKDF2-specifikationen föreskriver inte någon särskild PRF, så implementatorer kan välja vilken PRF de vill ha (så länge den uppfyller definitionen av en säker PRF och kan acceptera ingången som PBKDF2 ger den).
När det händer är det absolut vanligaste valet av PRF för PBKDF2 HMAC , vilket är en annan högkonstruktion som internt använder en kryptografisk hashfunktion . Återigen kräver HMAC-specifikationen ingen särskild hashfunktion, så implementatorer kan välja vilken hash de vill ha. Förmodligen det vanligaste valet idag är en av SHA-2 -familjen med hash, som inkluderar SHA-256 och SHA-512.
Så ”SHA512 inom PBKDF2” betyder nästan säkert att de använder PBKDF2 med HMAC som PRF, och med SHA-512 som hash inuti HMAC. **
Det som kan vara förvirrande är att blick, den här PBKDF2-med-HMAC-med-SHA512 kan se ut som om den gör något som liknar helt enkelt SHA-512: båda tar ett godtyckligt lösenord som inmatning och gör det till en pseudorandom bitsträng som det ursprungliga lösenordet inte kan lätt rekonstrueras.Det finns dock faktiskt flera skillnader, de viktigaste är att:
-
SHA-512 är snabb. Väldigt snabbt. PBKDF2 är medvetet långsam att beräkna, och dess långsamhet kan kontrolleras genom att justera parametern för iterationantal.
-
Som en direkt konsekvens av dess hastighet, SHA -512 ensam är sårbar för brute force-lösenordsgissningsattacker med programvara som hashcat , som helt enkelt genererar massor av lösenord och hash dem tills de hittar ett som ger en matchande hash . En enda modern processor kan enkelt hash miljoner lösenord per sekund, och GPU: er är ännu snabbare.
Dessutom finns det några andra mindre skillnader med att notera:
-
PBKDF2 tar en ”salt” -parameter, som kan användas för att säkerställa att utgångarna är unika även om ingångslösenorden inte är . (Att använda ett salt avvärjer också förberäkningsbaserade attacker, eftersom angriparen inte med fördel kan börja hascha gissat lösenord innan de känner till saltet.) SHA-512 har i sig inte begreppet salt, även om en motsvarande effekt kan uppnås t.ex. genom att lägga saltet till lösenordet.
-
SHA-512 producerar alltid en 512-bitars utmatning (därav namnet), även om du alltid kan trunka den till en kortare längd om du behöver inte hela 512 bitarna. PBKDF2 kan i princip producera utdata av vilken längd som helst, även om i praktiken genererar mer än en intern hashutgång till bitar rekommenderas inte .
*) Den ursprungliga HMAC-definitionen och säkerhetsbevis antar effektivt att hashfunktionen som används är av en viss typ känd som en Merkle – Damgård hash-funktion . När det händer har alla de mest populära kryptografiska hashfunktionerna under de senaste decennierna, inklusive SHA-2-familjen, varit av denna typ, så denna begränsning har inte varit mycket problem i praktiken. Detta kan förändras gradvis med standardiseringen av SHA-3 (aka Keccak), vilket är inte en Merkle – Damgård-hash, men bekvämt, kommer med sitt eget säkerhetsanspråk för HMAC-SHA3 .
**) Detta är en bra och traditionellt val, så långt det går. Det är inte lika motståndskraftigt mot GPU-baserade och andra parallella attacker som mer moderna KDF: er som scrypt eller Argon2 skulle vara, men det är fortfarande mycket bättre än vanlig gammal icke-itererad hashing. Med det sagt, för att korrekt utvärdera dess säkerhet, skulle vi också behöva veta iterationsräkningen som används för PBKDF2. Tyvärr tenderar många PBKDF2-implementeringar att använda det gamla ”rekommenderade minimum” på 1000 iterationer, vilket är lite mer än en hastighetsstöt nuförtiden. Personligen, på en modern CPU, Jag föredrar något närmare 1 000 000 eller 1 000 000 000 iterationer .
Kommentarer
- Fråga: Används PBKDF2 bara för att sänka antalet gissningar (om bruteforce)? Eller finns det några andra detaljer att tänka på?
- @NaveenNiraula : Förutom att sakta ner gissning av brute force, har PBKDF2 det sekundära syftet att konvertera lösenord med godtycklig längd och format till enhetligt pseudorandom bitsträngar. Men helt enkelt hashing kan åstadkomma det också. Saltparametern gör det möjligt att härleda flera olika nycklar från samma lösenord och förhindrar vissa attacker med förberäknade ordböcker som ” regnbågstabeller ”. Men igen, om du inte ’ t behöver gissningsskyddet för PBKDF2, du kan bara använda vanlig HMAC för det, eller till och med bara sammanfoga saltet med lösenordet innan du hasar det.
PBKDF2(HMAC_SHA512, password, ...)
.