Fråga:
Varför är hashfunktioner ett sätt? Om jag känner till algoritmen, varför kan jag inte beräkna ingången från den?
Mucker
2012-02-14 17:09:50 UTC
view on stackexchange narkive permalink

Varför kan inte ett lösenordshash konverteras?

Jag har tittat på det här för länge sedan och har läst mycket om det, men jag kan inte hitta förklaringen till varför det inte kan ske. Ett exempel gör det lättare att förstå min fråga och för att hålla sakerna enkla baserar vi den på en hashingalgoritm som inte använder salt ( LanMan).

Säg min lösenord är "Lösenord". LanMan kommer att hash detta och lagra det i databasen. Cracking-program kan tuffa dessa genom att hashing lösenord gissningar som du tillhandahåller. Den jämför sedan den genererade hashen med hashen i databasen. Om det finns en matchning löser det lösenordet.

Varför, om lösenordsmackaren känner till algoritmen för att förvandla ett lösenord till vanlig text till en hash, kan det inte bara vända processen för att beräkna lösenordet från hashen?

Den här frågan var IT-säkerhetsfrågan i veckan .
Läs den 24 februari 2012 blogginlägg för mer information eller skicka in din egen Veckans fråga.

migrera det här till [crypto.se] eller till och med [security.se] eftersom jag bara ser felaktiga svar som blir upprösta och de som är korrekta adresserar inte riktigt ** varför ** delen av frågan.
Jag är överens, jag är lite förvirrad över varför dessa allvarligt felaktiga svar får så många uppröstningar.
Problemet med alla de angivna svaren nedan är att de verkar förklara varför du inte kan få tillbaka svaret, men sedan ta upp frågan "med tanke på detta, är det mer troligt att du får tillgång än om den lagrade lösenordet i vanlig text, eftersom du inte längre behöver en exakt matchning. " Det enda sättet detta täcks på är när folk säger "Åh, men det är verkligen osannolikt". Det är fortfarande mer troligt än om du måste få en exakt matchning!
Om en lösenordssmällare känner till processen för att göra en ko till nötkött, betyder det då att han kan "bara vända" det och göra nötkött till en ko?
_ "är precis som en mask som går av en gren på ett träd för att ta en dusch vid floden. Om han bestämmer sig för att gå tillbaka till den exakta gren som han var tidigare kommer han att misslyckas och alla kommer att skratta åt honom" _
Vilken mycket frustrerande uppsättning svar att komma över. Svaret är enkelt: varje hash kan vara resultatet av att ett oändligt antal strängar hashas, ​​så det finns inget sätt att veta vilken en hash var tänkt att representera - ännu enklare sagt, en hash representerar inget värde .
Elva svar:
Dietrich Epp
2012-02-14 21:37:08 UTC
view on stackexchange narkive permalink

Låt mig uppfinna en enkel "lösenordshash-algoritm" för att visa dig hur den fungerar. Till skillnad från de andra exemplen i den här tråden är den här faktiskt livskraftig om du kan leva med några bisarra lösenordsbegränsningar. Ditt lösenord är två stora primtal, x och y. Till exempel:

  x = 48112959837082048697y = 54673257461630679457  

Du kan enkelt skriva ett datorprogram för att beräkna xy i O ( N ^ 2) tid, där N är antalet av siffror i x och y. (I grund och botten betyder det att det tar fyra gånger så lång tid om siffrorna är dubbelt så långa. Det finns snabbare algoritmer, men det är irrelevant.) Lagra xy i lösenordsdatabasen.

  x * y = 2630492240413883318777134293253671517529  

Ett barn i femte klass får tillräckligt med papper , kunde räkna ut det svaret. Men hur kan du vända det? Det finns många algoritmer som människor har tagit fram för att ta med stort antal, men även de bästa algoritmerna är långsamma jämfört med hur snabbt du kan multiplicera x med y. Och ingen av dessa algoritmer kunde utföras av en femte klassare, såvida inte siffrorna var mycket små (t.ex. x = 3, y = 5).

Det är nyckelegenskapen: beräkningen är mycket enklare går framåt än bakåt. För många problem måste du uppfinna en helt ny algoritm för att vända en beräkning.

Detta har ingenting att göra med injektions- eller bijektivfunktioner. När du knäcker ett lösenord är det ofta spelar ingen roll om du får samma lösenord eller om du får ett annat lösenord med samma hash. Hashfunktionen är utformad så att det är svårt att vända den och få något svar alls, till och med ett annat lösenord med samma hash. I crypto-speak: en hash-funktion som är sårbar för en preimage-attack är helt värdelös. (Lösenordshashingsalgoritmen ovan är injektiv om du har en regel som x < y. )

Vad gör kryptografisexperter? Ibland försöker de räkna ut nya algoritmer för att vända en hashfunktion (förbild). De gör exakt vad du säger: analysera algoritmen och försök att vända den. Vissa algoritmer har vänt om tidigare, andra inte.

Övning för läsaren: Antag att lösenordsdatabasen innehåller följande post:

  3521851118865011044136429217528930691441965435121409905222808922963363310303627 

Vad är lösenordet? (Den här är faktiskt inte så svår för en dator.)

Fotnot: På grund av det lilla antalet lösenord som människor väljer i praktiken är en bra lösenordshash inte bara svår att beräkna bakåt men också tidskrävande att beräkna framåt, att sakta ner ordlistaattacker. Som ett annat skyddslager förhindrar randomiserat salt användningen av förberäknade attacktabeller (t.ex. "regnbågsbord").

Fotnot 2: Hur vet vi att det är svårt att vända en hash-funktion? Tyvärr gör vi det inte. Vi känner bara inte till några enkla sätt att vända hashfunktioner. Att göra en hashfunktion som är bevisligen svår att vända är den heliga graden av hashfunktionsdesign, och den har inte uppnåtts ännu (kanske kommer det aldrig att hända).

Okej, så berätta svaret på den övning du har gett mig? Jag har ingen aning om hur jag ska lösa det, hur skulle jag ?? Och vad är injektivt och bijektivt?
@Mucker: En funktion f (x) är injektiv om f (x) = f (y) innebär x = y, dvs inga två ingångar har samma utgång. En bijektiv funktion är en injektionsfunktion som också är surjektiv, dvs. för varje möjlig utgång finns en motsvarande ingång. När människor säger "bijective" i den här tråden borde de verkligen säga "injective". Båda begreppen är inte riktigt relevanta för lösenordshash-säkerhet. Att berätta svaret för läsarövningen motverkar dess syfte, jag skrev aldrig ner svaret ändå (det existerar, jag vet bara inte vad det är).
@DietrichEpp kan du lägga till ditt svar att de flesta kryptografiska hashfunktioner faktiskt använder enkla operationer som `lägg till och, eller, xor, rotera, mod` för att göra hashningen och inte primtal? (bara för att göra det tydligare)
@Mucker: Uppenbarligen påverkar det 1451730470513778492236629598992166035067 x 2425967623052370772757633156976982469681 (Det tog faktiskt ungefär tio minuter CPU-tid med SIQS-metod på en enda 3GHz-kärna.)
@drjimbob: Trevligt! Här är en länk som jag använde: http://primes.utm.edu/lists/small/small.html
Här är länken jag använde: http://www.alpertron.com.ar/ECM.HTM
Jag vill tillägga att hash också är komprimering. Du kan hash en (hög entropi) x GiB-fil och få en 160bit-smältning. Information går förlorad (även om len (m)
@Tie-fighter: Mycket, mycket förlorad komprimering - som du noterar är mängden förlorad information så enorm att den bara komprimeras i mycket teknisk mening, jag är frestad att lägga till.
"det spelar ofta ingen roll om du får samma lösenord eller om du får ett annat lösenord" - Men det gör det när ingången inte är helt godtycklig men måste uppfylla vissa krav, till exempel ett lösenord + känt salt, eller ett meddelande i ett visst protokoll. Detta gör den datastörande aspekten av hash till nytta för säkerheten. (Naturligtvis, om du försöker tillräckligt länge kan du hitta en ingång som följer kraven, men det tar ännu längre tid)
@BartvanHeukelom: Det är faktiskt inte sant. Att förstöra data är irrelevant, den enda relevansen är kostnaden för en preimage-attack. Att använda salt ökar inte kostnaden för en preimage-attack, det hindrar bara angripare från att köra preimage-attacker parallellt eller i förväg. Missförstå inte, salt är viktigt - men det finns ingen verklig fördel för icke-injektionsfunktioner här.
@juanpastas: Din ändring är felaktig. Om du använder produkten xy som lösenord, fungerar inte schemat. Lösenordet är båda siffror och produkten lagras i lösenordsdatabasen.
Jag har en fråga, hur vi väljer två primtal? Om jag har en hash-tabell för att lagra värde som 6 (2 * 3), 63 (7 * 9), naturligtvis, mycket större produktvärde med 2 primtal. Och vi gör "reverse engineering", kan vi få de två primtalen mycket snabbare? och om vi fortsätter att bygga denna tabell som 9x9-tabell (multiplikationstabell), är den här metoden möjlig att bryta denna hashmekanism?
@Timeless: Metoden hash-tabell fungerar aldrig, eftersom hash-tabellen skulle vara för stor och det skulle ta för mycket tid att skapa hash-tabellen. Den senaste tekniken för att ta med stora nummer är * det allmänna siffrans sikt * som fortfarande är för långsamt för stort antal.
Thomas Pornin
2012-09-03 07:17:09 UTC
view on stackexchange narkive permalink

Nu är det en bra fråga.

Vi måste först ge en precision: många envägsfunktioner, särskilt hashfunktion som vanligt används i kryptografi, accepterar ingångar från ett utrymme som är mycket större än utrymmet för utdata. Till exempel är SHA-256 definierad för ingångar som är strängar på upp till 18446744073709551615 bitar; det finns 2 18446744073709551616 -1 möjliga ingångar, men eftersom utmatningen alltid är en sekvens på 256 bitar finns det bara 2 256 möjliga utgångar för SHA-256. Nödvändigtvis ger vissa distinkta ingångar samma utdata. För en given utgång av SHA-256 är det därför inte möjligt att entydigt återställa ingången som användes, men det kan vara möjligt att beräkna en ingång som ger det angivna utgångsvärdet. Preimage-motstånd handlar om det: svårigheten att hitta en matchande ingång för en utgång (oavsett hur utgången erhölls i första hand).

Så vi pratar om en funktion att alla kan beräkna över vilken input som helst (med hjälp av ett allmänt känt program, inget hemligt värde inblandat - vi pratar inte om kryptering).


Vad akademiker säger

Det är oklart om envägsfunktioner faktiskt kan existera. Just nu har vi många funktioner som ingen vet hur man inverterar; men det betyder inte att de är omöjliga att invertera, i matematisk mening. Observera dock att det inte är bevisat att envägsfunktioner inte kan finnas så hopp kvarstår. Vissa människor misstänker att huruvida envägsfunktioner kan existera eller inte kan vara en av dessa irriterande matematiska påståenden som varken kan bevisas eller motbevisas ( Gödels sats bevisar att sådana saker måste finnas). Men det finns inget bevis på det heller.

Därför finns det inget bevis på att någon given hashfunktion verkligen är motståndskraftig mot förbilder.

Det finns några funktioner som kan kopplas till välkända hårda problem. Till exempel, om n är en produkt av två stora primtal, är funktionen x x2 mod n är svår att invertera: att kunna beräkna kvadratrötter modulo ett icke-primärt heltal n (på allmän basis) motsvarar att kunna faktor n , och det problemet är känt för att vara svårt. Inte bevisat att vara svårt, kom ihåg; bara att matematiker har försökt att effektivt faktorera stora heltal under (åtminstone) de senaste 2500 åren, och även om vissa framsteg har gjorts hittade ingen av dessa smarta människor en riktigt mördande algoritm för det. Världsrekord för faktorisering av en "RSA-modul" (en produkt av två slumpmässigt utvalda stora primtal av samma längd) är ett 768-bitars heltal.

Vissa hashfunktioner baserade på sådana "hårda problem" har föreslagits. se till exempel MASH-1 och MASH-2 (om RSA-problemet) och ECOH (med elliptiska kurvor). Det finns bara några få sådana funktioner eftersom:

  • Att göra ett "svårt problem" till en säker hash-funktion är inte lätt. det finns många knepiga problem. Till exempel, medan extrahera kvadratrötter modulo en icke-primär n är vanligtvis hård, finns det värden för vilken extraktion av kvadratrot är lätt.

  • Prestandan för sådana hashfunktioner tenderar att vara, låt oss säga, suboptimal. Som att vara 100 gånger långsammare än en vanligare SHA-1.

Det mer "vanliga" sättet att bygga en hash-funktion är att få ihop kryptografer och få dem att gnaga på några föreslagna mönster; de funktioner som överlever kryptoanalytiska försök i några år anses då "troligen robusta". SHA-3-tävlingen är en sådan ansträngning; vinnaren bör tillkännages senare i år. På de 51 kandidaterna (de som lyckades med det administrativa steget) behölls 14 för "runda 2" och dessa 14 har varit relativt noggrant tittade på av många kryptografer, och ingen av dem fann något som verkligen var värt att säga om funktionerna. Listan har reducerats till 5 och kommer att minskas ytterligare till 1 "snart", men inte av säkerhetsskäl (de flesta faktiska uppgifterna handlade om prestanda, inte motstånd).


Vad gör MD5 svårt att invertera

Eftersom vi inte vet hur man bevisar att en funktion är svår att invertera, är det bästa vi kan göra att ge den ett försök med en specifik funktion för att få en "intuition" av hur funktionen uppnår sitt uppenbara motstånd.

Jag väljer MD5, vilket är välkänt. Ja, MD5 är "trasig", men det är för kollisioner, inte förbilder. Det finns en känd preimage-attack som åtminstone teoretiskt sett är snabbare än det generiska sättet (det "generiska sättet" är "tur", dvs att försöka ingångar tills en matchning är hittade, för en genomsnittlig kostnad av 2128 utvärderingar eftersom MD5 har en 128-bitars utdata; Sasaki-Aoki-attacken har kostat 2 123.4 , vilket är lägre, men ändå alldeles för högt för att verkligen kunna prövas, så resultatet är fortfarande teoretiskt). Men MD5 är relativt enkelt och har motstått attacker under en längre tid, så det är ett intressant exempel.

MD5 består av ett antal utvärderingar av en "komprimeringsfunktion" över datablock. Inmatningsmeddelandet är först vadderat så att dess längd blir en multipel av 512 bitar. Den delas sedan upp i 512-bitarsblock. Ett 128-bitars körläge (innehas i fyra 32-bitars variabler som heter A , B , C och D ) initialiseras till ett konventionellt värde och bearbetas sedan med komprimeringsfunktionen . Kompressionsfunktionen tar körningstillståndet och ett 512-bitars meddelandeblock och blandar dem till ett nytt värde för körningstillståndet. När alla meddelande block har bearbetats så är det slutliga värdet av det körande tillståndet hash-utdata.

Så låt oss koncentrera oss på komprimeringsfunktionen. Det fungerar så här:

  • Ingångar: det körande tillståndet ( A B C D ) och ett meddelande block M . Meddelandeblocket är 512 bitar; vi delar upp det i 16 32-bitars ord M0 , M1 , M 2 , ... M15.
  • Utgång: det nya körningsstatusvärdet.
  • Bearbetning:

    1. Spara det aktuella tillståndet i vissa variabler: A → A ', B → B' , C → C ' och D → D'
    2. Gör 64 rundor som ser ut så här:
      • Beräkna T = B + ((A + f i (B, C, D) + M k + X i ) <<< s i under>) . Detta lyder så här: vi beräknar en given funktion fi (en enkel bitvis funktion, som beror på det runda numret i ) över B , C och D . Lägg till värdet A , ett meddelandeord Mk och en konstant X i (tillägg görs modulo 232 ). Rotera resultatet åt vänster med några bitar (skiftbeloppet beror också på rundan). Lägg till slut till B : resultatet är T.
      • Rotera tillståndsorden: D → A , C → D , B → C , T → B .
    3. Lägg till de sparade tillståndsvärdena i de aktuella tillståndsvariablerna: A + A '→ A , B + B' → B , C + C '→ C , D + D '→ D .

Det viktiga är att det finns 64 omgångar, men endast 16 meddelandeord. Detta innebär att varje meddelande ord kommer in i behandlingen fyra gånger . Jag skriver det med fetstil eftersom det är den centrala punkten; motstånd mot förbilder kommer från den egenskapen. Vilket meddelandeord som används i varje omgång beskrivs i MD5-specifikationen (RFC 1321); specifikationen beskriver också funktionerna fi , rotationsräkningarna si och 32-bitars konstanter X i .

Antag nu att du försöker "invertera" MD5; du börjar från utgången och arbetar långsamt upp komprimeringsfunktionen. Först måste du bestämma utgången från runda 64. Faktum är att komprimeringsfunktionens utgång är summan av utgången från runda 64 och det sparade tillståndet ( A 'B' C 'D' värden). Du har ingen av dem, så du måste välja. Ditt hopp är att du kommer att kunna hitta värden för meddelandeorden som gör att du kan få för inmatning av omgång 1 några värden som överensstämmer med ditt godtyckliga beslut om A ' och dess bröder.

Låt oss se hur saker ser ut när du går kompressionsfunktionen bakåt. Du har output av en runda (variablerna A , B , C och D efter omgången) och du vill beräkna ingången för den omgången. Du känner redan till de tidigare värdena för B , C och D men för A och M k du har gott om val: varje 32-bitarsvärde är möjligt för A och alla har motsvarande M k sub > . Först är du glad över det; vem skulle förneka sådan frihet? Välj bara en slumpmässig Mk , och detta ger motsvarande A med bara några operationer (prova det!).

Men efter att du har vänt in på det sättet 16 omgångar (omgångarna 49 till 64, eftersom du arbetar bakåt) försvinner friheten. Du har "valt" värdena för alla meddelandeord. När du försöker invertera omgång 48 vill du beräkna värdet av A strax före den omgången; enligt MD5-specifikationen används meddelandeordet M2 i omgång 48, och du har redan valt värdet M 2 (vid omvändning av omgång 63). Så det finns bara ett val för A . Så vad, skulle du säga. Ett val är tillräckligt för att fortsätta bakåt. Så du fortsätter.

Nu är du i början av komprimeringsfunktionen. Kom ihåg att från början gjorde du ett godtyckligt val av värdena för A 'B' C 'D' : detta gjorde att du kunde beräkna utdata från runda 64 och börja gå bakåt. Nu har du fått inmatningen i omgång 1, som ska vara identisk med A 'B' C 'D' ... och den matchar inte. Det är helt normalt: du valde A 'B' C 'D' godtyckligt och du valde också meddelandeorden Mk godtyckligt, så det kan förväntas att det inte fungerar för det mesta. Så du försöker reparera beräkningen genom att retroaktivt ändra antingen ditt ursprungliga val av A 'B' C 'D', eller ett eller flera av de slumpmässiga valen för M k . Men varje modifiering på alla Mk innebär modifieringar någon annanstans, eftersom varje Mk används fyra gånger. Så du behöver andra modifieringar för att avbryta de andra och så vidare ...

Vid den tiden börjar du förstå problemet med att invertera MD5: varje gång du trycker på en enda bit, utlöser det en hemsk många ändringar genom algoritmen, som du måste avbryta genom att röra vid andra bitar, och det finns bara för många interaktioner. I grund och botten jonglerar du med 2128 bollar samtidigt, och det är alldeles för mycket för att hålla reda på dem alla.

Om varje meddelandeblock var 2048-bitar långt, uppdelat i 64 ord och varje meddelandeord användes bara en gång i MD5, kunde du enkelt invertera det. Du gör som ovan: godtyckligt val av A 'B' C 'D' , godtyckligt val av meddelandeord för omgång 64 till 5; och för de första fyra omgångarna överväger du bara det värde du vill erhålla för den runda ingången (det värde som matchar ditt godtyckliga val av A ', B' , C ' eller D' ) och räkna ut motsvarande meddelandeord. Lätt som en plätt. Men MD5 behandlar inte data med 2048-bitarsblock, utan med 512-bitarsblock, och varje meddelandeord används fyra gånger.


Några ytterligare vändningar

Strukturen för komprimeringsfunktionen för MD5 är faktiskt en generalisering av en Feistel-kodning. I en Feistel-chiffer delas data i två halvor, och för varje runda ändrar vi ena halvan genom att lägga till / xora den till ett mellanliggande värde som beräknas från den andra halvan och från nyckeln; och sedan byter vi de två halvorna. Utöka detta schema till en delning med fyra delar, och du får samma struktur än MD5-rundorna - med 90 ° rotering: MD5 ser ut som krypteringen av nuvarande tillstånd med hjälp av meddelande blocket som tangent (och det finns extra tillägg av utgången från runda 64 med det sparade tillståndet, som avviker MD5 från en roterad chiffer).

Så kanske vi kan bygga hashfunktioner ur block cifrar? Det kan vi faktiskt: det är vad Whirlpool handlar om. En hash-funktion byggd över en roterad blockchiffer (meddelandeblocket är nyckeln); blockkodningen av Whirlpool är "W", ett derivat av Rijndael, bättre känt som AES. Men W har större block (512 bitar istället för 128 bitar) och ett nyckeltabell för reforged.

När du gör en hashfunktion av en roterad blockkodning är preimage-attacker på hashfunktionen något motsvarande viktiga rekonstruktionsattacker på blockkodningen; så det finns något hopp om att blockkodningen är säker, så är hash-funktionen också. Där igen finns det snarkiga detaljer. För en sådan struktur är kollisioner på hashfunktionen som attacker med relaterade nycklar på blockkodningen; relaterade nyckelattacker anses vanligtvis inte vara dödliga och ignoreras ofta (till exempel var de inte en del av utvärderingskriterierna för AES-tävlingen, och Rijndael är känd som lite fläckig i det avseendet, varför W har en helt ny nyckel schema).

Vissa nyare konstruktioner är byggda över en blockkodning som inte roteras, så att hashfunktionens säkerhet kan härledas mer direkt från blockkodningens säkerhet; se till exempel SHA-3-kandidaten Skein, definierad över en blockkodning som heter Threefish.

Omvänt kan man försöka göra en blockkryptering av en hashfunktion. Se till exempel SHACAL, som är SHA-1 "stående upprätt". Och, i kö, SHACAL har några svagheter med relaterade nycklar som liknar de kända svagheterna hos SHA-1 när det gäller kollisioner (ingen faktisk kollision beräknades, men vi har en metod som borde vara nästan en miljon gånger snabbare än generisk kollisionsfyndningsalgoritm).

Därför, i motsats till vad jag sa i inledningen av det här inlägget, har vi pratat om kryptering hela tiden . Det finns fortfarande mycket att upptäcka och studera om länkarna mellan hashfunktioner och symmetrisk kryptering.


TL; DR: det finns ingen TL; DR för detta meddelande . Läs det hela eller börja.

Bästa TL; DR-citat någonsin. Jag tror att jag måste skapa en ny stack i min evernote bara för dina svar. Skriver du några artiklar eller böcker av en slump?
Jag bryr mig inte om att det är sent, jag måste säga detta: Riktigt bra förklaring som verkligen visar komplexiteten du kan skapa med algoritmer. Jag hade denna okunniga tanke att allt enkelt kunde göras bakåt om du visste hur man skulle göra det framåt (med hjälp av datorer), och detta visar tydligt att det inte är så enkelt. Exemplet med MD5 var också bra, eftersom det låter dig faktiskt se komplexiteten för vad det är (till skillnad från analogier [som också är bra, missförstå mig inte)). Återigen, riktigt bra och upplysande artikel; hoppas kunna läsa mer från dig.
Fascinerande. Detta borde vara svaret.
"x ⟼ x2 mod n är svårt att invertera" ... Detta verkar osannolikt, speciellt eftersom du (eller den som använder detta i en hash-funktion som de designade, t.ex. NSA) har tillgång till de stora primtallarna.
Hej, när du säger "Det är oklart om envägsfunktioner faktiskt kan existera. Just nu har vi många funktioner som ingen vet hur man inverterar; men det betyder inte att de är omöjliga att invertera, i matematisk mening", vad syftar du på?Om vi till exempel tittar på funktionen "golv", hävdar vi att det är "inte omöjligt att invertera"?Tack!
@AsheKetchum En envägsfunktion är per definition motståndskraftig, så innebörden är inte precis vad du förväntar dig.Om du har `golv (n) = 7` kan jag" invertera "det med` n = 7.2`.Även om det inte är det ursprungliga värdet "inverterade" jag det ändå.Jag upptäckte inte det ursprungliga värdet av `n` som du kanske har haft i åtanke, men jag upptäckte _a_-värde som löser ekvationen, vilket bevisar att det inte är envägs i kryptografisk mening.
@cnd Den ekvationen var bara ett exempel på en envägsfunktion som kallas en "dörrfunktion".Funktioner av det slaget är _normalt_ envägs, men inte om du har tillgång till vissa hemliga variabler som används för att skapa funktionen, i så fall multipliceras de primära numren för att härleda _n_.Verkliga hashfunktioner använder inte dörrfunktioner, så deras enkelriktning är ovillkorlig och inte beroende av sekretess av något värde.
år efter ditt svar (och några före den här kommentaren), [en faktisk SHA-1-kollision beräknades] (https://shattered.io)
nealmcb
2012-02-16 21:56:33 UTC
view on stackexchange narkive permalink

Det första steget till svaret här är att se exempel, som den fina från @Dietrich, på funktioner som är mycket svårare att springa i en riktning än det inversa, och har motstått många försök att hitta ett hastighetsgenombrott. Men problemet är komplicerat, så jag ska försöka konkretisera det mer.

Massor av människor verkar falla i fällan (heh) för att tro att hashfunktioner är faktiskt på något sätt magiskt - att de verkligen är absoluta "envägsfunktioner" som matematiskt inte kan köras bakåt alls, bara för att de kallas hash. Detta är inte ett hälsosamt sätt att tänka på det i ett säkerhetsforum. Det är ofta fel i praktiken. Och det är alltid fel i teorin, med tanke på den grundläggande matematiska definitionen av en funktion som en mappning från en domän till en bild.

Alla haschar kan i princip vändas. Det kan vara rörigt och brutalt (som i brute-force), det kan ta opraktiskt lång tid med dagens hårdvara, och det kan till och med hålla upp under lång tid, men matematiskt är det helt enkelt en tidsfråga. Som @mucker noterade finns all information för att hitta det ursprungliga lösenordet (eller åtminstone ett lösenord som fungerar). Om vi ​​glömmer bort det glömmer vi faran med smarta heuristik för att lösa lösenord som körs i körsbärsplockning, vilket gör nyheterna regelbundet. Hashing är ett tekniskt problem och den primära utmaningen är en effektivitet - hur man gör det dyrt att hitta lösenordet med hash. Ett av de viktigaste resultaten av den typen av tänkande är vikten av att göra lösenordshashar långsam

Och hashvetenskapen och matematiken blir bara långsamt bättre. Det finns verkligen inga bevis för att det är svårt att haska. @ Dietrichs svar är ett trevligt sätt att illustrera hur ideala hashfunktioner kan vara möjliga. Men titta bara på de riktiga experterna som beskriver hur vi inte har bevis för någon av de bästa kryptoalgoritmerna: Vad är den matematiska modellen bakom säkerhetsanspråk för symmetriska chiffrer och smältalgoritmer?

Det faktum att LanMan citerades i frågan är ännu mer bevis för att vi måste undvika att idealisera hash. LanMan är allt annat än en idealisk hashfunktion, lätt besegrad av en kombination av lite analys och lite brute forcing. För ett annat populärt exempel på en hemsk hash-funktion, se MySQL OLD_PASSWORD cryptanalysis?.

Så ta dig tillbaka ur fällan - att falla i det behöver inte vara en enkelriktad resa . Inse att hash är reversibla, och håll den pålitliga säkerhetstänningen aktiv när du letar efter det bästa sättet att vända dem. Det är ofta det bästa sättet att hitta sådana som verkligen är svåra att vända. Jag försöker inte kasta hänsyn till de bästa metoderna där ute, som bcrypt eller PBKDF2 eller scrypt. Men bevisen är tydliga att även bra programmerare gör alltför ofta fel på det här. Så var försiktig med hur du använder dem och försök inte uppfinna dina egna.

Jag försöker lista ut vad du kan mena med "all information finns för att hitta det ursprungliga lösenordet." Menar du "all information finns för att hitta ett lösenord som genererar samma hashvärde med den givna hashalgoritmen"? Eftersom det förra inte är sant ... många hashförlorar information.
@LarsH du har rätt, de flesta hash förlorar information, och du kanske inte kan hitta det ursprungliga lösenordet. Men för det mesta behöver du bara ett lösenord som resulterar i samma hash, och det är alltid möjligt, med tillräckliga resurser, så länge det är en giltig hash. Jag har uppdaterat mitt svar lite.
coredump
2012-02-14 17:19:39 UTC
view on stackexchange narkive permalink

Eftersom det är så kryptografiska hashfunktioner fungerar, är de envägs (från vanlig till hash) matematiska funktioner. Algoritmer är gjorda och testade specifikt för att undvika det, och undviker också kollisioner (två olika vanliga texter genererar samma hash).

Du kan läsa mer på wikipedia, men huvudpoängen i artikeln är:

Den perfekta kryptografiska hashfunktionen har fyra huvudsakliga eller signifikanta egenskaper:

  • det är enkelt (men inte nödvändigtvis snabbt) att beräkna hash värde för ett visst meddelande
  • det är omöjligt att generera ett meddelande som har en given hash
  • det är omöjligt att ändra ett meddelande utan att ändra hash
  • det är omöjligt att hitta två olika meddelanden med samma hash

De flesta attackerna på hashfunktioner är baserade på att hitta kollisioner (så två olika vanliga texter matchar samma hash) eller i förväg generera miljontals hash och jämföra dem tills du hittar slätten som genererade den.

Lång historik kort: om en hasghalgoritm är ombyggbar eller kan attackeras så sätt, det är inte en goo d hashalgoritm.

För lösenord, undersökning med BCrypt, detta inlägg har mycket information om det.

Ja. De är svåra att vända per definition.
Hashes är inte utformade för att undvika kollisioner. Kollisioner är alltid närvarande, i överflöd, eftersom det finns många fler möjliga inmatningsvärden än utmatningsvärden. Som Wikipedia säger är målet helt enkelt att göra det omöjligt att hitta kollisionerna. Och som jag noterar i mitt svar är det olyckliga faktum att endast ett litet antal hashfunktioner har någon meritlista för att faktiskt uppfylla kraven som fastställts, trots de många som har designats och populariserats.
Detta svar säger i princip "hashfunktioner är envägs eftersom hashfunktioner är envägs". Du kanske vill ge en mer noggrann matematisk förklaring till hur en hashfunktion fungerar för att bättre beskriva varför_ detta faktum.
När det gäller "undvik kollisioner" - det beror på vad som menas med "gjort för att undvika." Hash (åtminstone vissa, beroende på syftet) är utformade för att * minimera * kollisioner, eftersom det gör det svårare att hitta dem. Men de eliminerar i allmänhet inte kollisioner.
user1068775
2012-02-18 20:20:36 UTC
view on stackexchange narkive permalink

Föreställ dig en hash-funktion som använder en enda bit för hashen. Så din hash kan antingen vara 0 eller 1.

Och låt oss säga att hashfunktionen lägger till varje byte av data och om data var jämna är hashvärdet 0. Om data var udda är hash är 1.

Ser du varför du inte kunde återställa dina data genom att omvända den hashfunktionen?

Det är detsamma för faktiska hasghalgoritmer, bara formlerna är betydligt bättre än funktionen som jag just beskrivit.

Din svårighet kan vara att du funderar på hash så långt som deras användning av lösenord. Det är inte uppenbart varför du inte kan återställa ett lösenord på 8 tecken från en 128-bitars hash. Men den hashfunktionen du använder för lösenord kan också användas för att beräkna hash för en hel terabyte data, och hash tar fortfarande bara 128 bitar data. Uppenbarligen kan du inte omvandla den 128-bitars hash och återställa din terabyte data.

Dessutom, förutsatt att du hade varje möjlig permutation av en enda terabyte data, skulle det finnas en enorm mängd olika data som genererar samma hash. När allt kommer omkring, om du har mer än 2 ^ 127 olika permutationer av data, kommer du troligtvis att stöta på två olika data som har samma hash.

Varför nedstämde någon detta? Det är ett helt rimligt svar på titelfrågan, "varför är hashfunktioner ett sätt?"
Massimo
2012-02-14 17:19:32 UTC
view on stackexchange narkive permalink

Det finns algoritmer som till sin natur inte är reversibla; de ändrar en ingång A till en utgång B på ett sådant sätt att även om du känner till de exakta stegen i algoritmen kan du inte återställa A från B.

Ett mycket enkelt exempel: konvertera varje tecken i lösenordet till dess ASCII-värde och summera alla värden. Du kan inte återställa det ursprungliga lösenordet från resultatet.

Men ... du behöver inte det ursprungliga lösenordet, du behöver bara något lösenord vars hash är densamma. Med andra ord behöver du en sträng vars summa av ASCII-värden är samma som hash-värdet, och det är enkelt.
Kommit överens. Men frågan ställer sig "varför kan det inte bara vända processen för att beräkna lösenordet från hash", inte "hur kan jag matcha hash även om jag inte vet lösenordet".
Som förklarats i andra svar är kryptografiska hashfunktioner svåra att vända eftersom de är utformade på ett sådant sätt att det är mycket dyrt att vända dem - inte för att det finns flera möjliga svar. I ditt exempel, även om det är omöjligt att vara säker på exakt vad det ursprungliga lösenordet var, är det trivialt att begränsa det till en relativt liten uppsättning lösenord, vilket är ett stort säkerhetsfel utöver det som förklaras av Neil G.
Jag tycker att det är ett bra exempel. Ja, det är en trivial algoritm som inte är säker i det minsta, men det illustrerar poängen med icke-reversibla algoritmer på ett mycket enkelt sätt.
mikeazo
2012-02-15 20:21:32 UTC
view on stackexchange narkive permalink

Det finns en aspekt av problemet som människor saknar i föregående svar. Det är den många-till-en-karaktären av hashfunktioner. Eftersom (de flesta) hashfunktionerna är en fast längdutmatning (t.ex. 256 bitar) finns det tekniskt sett oändligt många strängar som alla hash till samma värde.

Till exempel, om du tar alla 512-bitars strängar (varav det finns 2 ^ 512). Det finns bara 2 ^ 256 utgångar från hashfunktionen. Således finns det för varje utgång av hashfunktionen ungefär 2 ^ 256 512 bitars strängar som hash till det värdet. Jag säger ungefär för att vi inte vet om hashfunktionen faktiskt är en slumpmässig funktion, det kan ha små fördomar.

Således, med en sammandragning, finns det många strängar som hash till samma värde. Därför, om du definierar "att vända en hashfunktion" som att mata ut användarnas lösenord, hur kommer din reverseringsfunktion att hantera det potentiellt oändliga antalet strängar som resulterar i den givna sammandragningen?

rolig sak: för några timmar sedan (förmodligen innan du läste svaren) hade vi problemet med svaren som bara fokuserade på den aspekten av hashfunktionen och helt ignorerade de andra (viktigare) punkterna. Hur som helst tror jag att de aktuella svaren inte fokuserar på det eftersom användaren pratar om lösenord som _ vanligtvis_ har mycket mindre möjliga kombinationer än utdata från de flesta kryptografiska hashfunktioner.
En reverseringsfunktion kan inte veta vilken förbild som är det ursprungliga lösenordet som används av användaren, men det kommer ofta att vara ganska tydligt baserat på vanliga lösenordspraxis. Men det behöver inte, eftersom någon av förbilderna fungerar som lösenord.
@nealmcb, sant utom i några få omständigheter. Till exempel om ett salt används. Endast förbilden med rätt salt fungerar (en annan anledning att använda salter). Men ja, det kommer med överväldigande sannolikhet att vara så att den korrekta förbilden kan urskiljas. Om det emellertid finns 2 ^ 256 förbilder, skulle det vara en omöjlig mängd data att söka igenom.
@mikeazo Ett salt hjälper inte till att motverka en preimage-attack. Om din databas har äventyrats har hackaren både hash och salter, så hans arbetsbelastning är identisk med om han körde på en hash utan salt. I stället för att beräkna "preimage (hash)" beräknar han "preimage (hash || salt)". Vad ett salt hjälper till att motverka är ordlistaattacker (hackaren måste starta en separat ordbokattack på varje lösenord snarare än en för hela databasen) och regnbågstabeller (regnbågstabellen har inte inkluderat saltet i beräkningen ).
Detta är inte "en aspekt av problemet". Det är hela svaret. Det här är den mest frustrerande frågan jag någonsin har stött på, eftersom alla svaren är fel, förutom din. Jag läste inte hela svaret bara första stycket, som svarar på allt.
John Deters
2012-08-14 00:14:14 UTC
view on stackexchange narkive permalink

Du frågar "varför är det viktigt att hashfunktioner är enkelriktade?" Det är en säkerhetsegenskap.

Det finns två typer av "hash" (eller "meddelandesmältning" som de kallas) i vanligt bruk idag. Den ena är en vanlig meddelandesammandragning, som du kanske känner till som en kontrollsummealgoritm, till exempel CRC32. Algoritmen är utformad så att en enda bitförändring i ingången ger ett annat sammandragsvärde. Det främsta syftet med detta är att säkerställa att ett meddelande inte skadas av misstag. CRC32-kontrollsummor finns i alla TCP / IP-paket och en felaktig matchning resulterar i återutsändning för att rätta till felet.

Meddelandesammandragningar används ofta i kryptografi som en del av "signering" av ett meddelande. Meddelandet krypteras av avsändaren med sin privata nyckel, och vem som helst kan använda den offentliga nyckeln för att bekräfta att den bara krypterades av avsändaren. Men RSA-nyckelkryptografi kan bara kryptera meddelanden som är mindre än nyckelstorleken (256 byte), vilket är mycket kortare än de mest användbara meddelandena. Meddelandesammandragningsalgoritmer ger värden som är mindre än RSA-nycklar. Så genom att kryptera sammandraget istället för meddelandet kan RSA-signaturer användas i alla storlekar.

Men en vanlig meddelandesammandragning är inte säker mot en angripare. Tänk på en mycket enkel kontrollsumma som bara summerar karaktärernas värden. Om du undertecknade en sådan kontrollsumma kan jag byta ut alla andra meddelanden som ger samma kontrollsumma, och signaturerna skulle matcha och lura offret.

En annan vanlig användning för meddelandesammandragning är lösenordsskydd under lagring. Om du krypterar lösenorden innan du lagrar dem i systemet kan en systemadministratör som känner till nyckeln dekryptera dem alla. (Du kanske har märkt detta problem nyligen när vissa webbplatser hackades.)

För att undvika dessa problem behövs en annan typ av hash, en som är "kryptografiskt säker." En säker hashalgoritm har ytterligare två egenskaper, kollisionsmotstånd och icke-reversibilitet .

Kollisionsmotstånd innebär att jag inte skulle kunna hitta ett meddelande som ger samma sammandrag. På det sättet kan jag inte byta mitt onda meddelande mot ditt goda meddelande.

Egenskapen för icke-reversibilitet betyder att jag inte kan göra en sammandragning till en ren text så att jag inte kan dekryptera det ursprungliga meddelandet, som användarens lösenord.

Att skapa en sammanfattning är ett mycket liknande problem som kryptering, genom att du måste kryptera data på ett sådant sätt att den inte läcker någon information om originaldata. Det är ännu svårare, för samma matematik måste inte ge några ledtrådar om hur man lyckas skapa en kollision.

James
2012-02-15 17:55:31 UTC
view on stackexchange narkive permalink

Andra har förklarat varför bra kryptografiska hashfunktioner är svåra att vända - men enligt denna Wikipedia-artikel är LanMan dåligt utformad och kan vändas relativt lätt:

Även om den är baserad på DES, en väl studerad blockkodning, är LM-hash inte en riktig enkelriktad funktion, eftersom lösenordet kan bestämmas från hash på grund av flera svagheter i genomförandet ... Genom att montera en brute force angrepp på vardera halvan separat kan moderna skrivbordsmaskiner knäcka alfanumeriska LM-hash på några timmar ... 2003 publicerades Ophcrack, en implementering av regnbågstekniken. Den riktar sig specifikt till svagheterna i LM-kryptering och innehåller förberäknade data som är tillräckliga för att knäcka praktiskt taget alla alfanumeriska LM-haschar på några sekunder.

Detta tar inte riktigt upp den faktiska frågan. Och dessutom är det inte sant att det kan vändas - bruteforce är inte omvänd (eller invers) av en hashfunktion.
Det svarar på en del av frågan - Mucker frågade specifikt om LanMan, där det är ganska enkelt att hitta ett matchande lösenord med en hash. Poängen är att denna speciella algoritm har svagheter (att dela lösenordet i två delar och konvertera gemener till stora bokstäver) som gör det väldigt enkelt att tappa kraft. Kan du förklara skillnaden du gör mellan att invertera hashfunktionen och brute tvinga den - jag skulle kalla den senare ett speciellt fall av det förra?
Eftersom OP frågar om inre av hashfunktioner frågar han varför funktionen inte bara kan omvändas * matematiskt *. Brute force är ortogonalt mot hash-inversion, det bryr sig inte vad den faktiska funktionen * är *. Det går i princip runt hashen, inte säkerhetskopierar den.
Jag förstår verkligen inte den skillnad du försöker göra. Hela poängen med en brute force-algoritm är att invertera hash. Den har exakt samma in- och utgångar som alla andra (korrekta) metoder för att invertera funktionen. Det är inte ens _nödvändigt_ den långsammaste metoden. Om du påpekar att - om hashfunktionen är mångsidig - kan den inte inverteras i strikt matematisk bemärkelse (för att den inte är en injektion) - då håller jag med men det är inte riktigt relevant: en hashfunktion kan vara injektiv det är faktiskt önskvärt att kollisioner är sällsynta.
@James - nej, en brutal kraft vänder inte någonting. Den försöker hela adressutrymmet med en algoritm och tillhandahåller hela utrymmet. Om det finns en matchning kan du göra några antaganden.
Jag tror att vi missförstår varandra. Jag använder ordet 'invertera' i matematisk mening - det vill säga 'hitta inmatningen av en funktion med tanke på dess utdata' (och jag använder 'omvänd' som en synonym). En brute force-metod är bara ett sätt att göra detta - det spelar ingen roll att vi genererar många andra resultat av funktionen i processen - de flesta algoritmer producerar värdelös skräp längs vägen. OP frågade varför lösenordet inte kan erhållas med tanke på hashen och algoritmen - och svaret är att det kan vara - det är bara svårt att beräkna, men i LanMans fall inte tillräckligt svårt.
Jag håller med din underliggande punkt att i LanMan-fallet ger en kombination av smart matematik och brute force en omvänd funktion som är mer än tillräckligt snabb för den verkliga världen. Men även om det inte fanns någon analys av funktionen involverad för att påskynda en brute force-tillvägagångssätt, skulle jag från en matematisk synpunkt fortfarande kalla en dum brute-force-funktion en "omvänd" funktion. Och definitivt en omvänd konstruerad funktion. Bara inte söt teknik ....
@avid och jag pratade mycket om de semantiska och pedagogiska frågorna i DMZ-chattrummet, och nu försökte jag klargöra hur jag ser det mer i mitt eget svar.
Lucifer Orichalcum
2012-07-17 20:22:14 UTC
view on stackexchange narkive permalink

Jag tror att det finns många anledningar, men en är uppenbar: en sammandrag som produceras av en hashfunktion kan aldrig innehålla oändlig information, eftersom uppslutningen har ändliga bitar. Men hash-funktionen kan användas för att hasha inmatningar av oändlig information. Ingången kan faktiskt vara vad som helst.

Svårigheten att ta reda på en kollision är inte svaret. Den verkliga svårigheten är att bevisa att dina ursprungliga data faktiskt är den enda möjliga inmatningen som matchar en viss sammandrag. Jag tror att du kanske aldrig beräknar en ingång och hävdar att det är det enda svaret på sammandraget.

gimenez
2012-08-02 01:17:32 UTC
view on stackexchange narkive permalink

Att vända en mod-hash är enkelt. Ex: - (sammanfattande byte) mod (d) = hash . Så om du vill generera alla ingångar för en hash är int byte summatory = int n * int d + int hash vad sägs om det?

Ff är XOR mellan två block det är enkelt, säg att biten är en, eller block 1 = 0 och block 2 = 1 , eller block 1 = 1 och block 2 = 0 . Anta att biten är 0 eller (b1 = 0 ^ b2 = 0) eller (b1 = 1 ^ b2 = 1) . Dessa är korrekta svar för samma utdata.

Det finns en skillnad mellan att vända en hash och att hitta en haschkollision. Beroende på ditt användningsfall kan resultaten vara desamma men de inblandade begreppen och konsekvenserna av att göra det är verkligen inte.


Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...