Fråga:
Vad är användningen av en klient nonce?
user700503
2011-04-10 07:56:56 UTC
view on stackexchange narkive permalink

Efter att ha läst del I av Ross Andersons bok, Security Engineering , och klargjort några ämnen på Wikipedia, kom jag över tanken på Client Nonce (cnonce). Ross nämner det aldrig i sin bok och jag kämpar för att förstå syftet det tjänar i användarautentisering.

En normal nonce används för att undvika omspelningsattacker som innebär att ett utgånget svar används för att få privilegier. Servern förser klienten med ett nonce (Number used ONCE) som klienten tvingas använda för att hash sitt svar, servern hasar sedan svaret som den förväntar sig med den nonce den tillhandahöll och om klientens hash matchar hash för server kan servern verifiera att begäran är giltig och ny. Detta är allt det bekräftar; giltiga och fräscha .

Förklaringarna jag har hittat för en klient som inte är mindre är emellertid mindre okomplicerade och tveksamma. Wikipedia-sidan för autentisering av digital åtkomst och flera svar här på Stackoverflow verkar tyda på att en klient nonce används för att undvika valda klartextattacker. Jag har flera problem med denna idé:

  • Om en person kan sniffa och infoga paket är den största sårbarheten en man-i-mitten-attack som varken en nonce eller en cnonce kan övervinna, gör därför båda meningslösa.
  • Om vi ​​antar en sekund att angriparen inte vill delta i en man-i-mitten-attack och vill återställa autentiseringsdetaljerna, hur ger en cnonce ytterligare skydd ? Om angriparen avlyssnar kommunikation och svarar på en begäran med sin egen nonce, blir svaret från klienten en hash av nonce, data och cnonce förutom cnonce i okrypterad form. Nu har angriparen tillgång till nonce, cnonce och hash. Angriparen kan nu hash sina regnbågsbord med nonce och cnonce och hitta en matchning. Därför ger cnonce noll ytterligare skydd.

Så vad är syftet med en cnonce?

Jag antar att det finns någon del av ekvationen som jag inte förstår men jag har ännu inte hittat en förklaring till vad den delen är.

EDIT Vissa svar har föreslog att klienten kan tillhandahålla ett nonce och det kommer att tjäna samma syfte. Detta bryter dock utmaningssvar-modellen, vad är konsekvenserna av detta?

Fyra svar:
Thomas Pornin
2011-04-11 18:03:24 UTC
view on stackexchange narkive permalink

En nonce är ett unikt värde som en enhet väljer i ett protokoll, och det används för att skydda enheten mot attacker som faller under det mycket stora paraplyet "replay".

Tänk till exempel på ett lösenordsbaserat autentiseringsprotokoll som går så här:

  • servern skickar en "utmaning" (ett förmodligen slumpmässigt värde c ) till klient
  • klient ska svara genom att skicka h (c || p) där h är en säker hash-funktion (t.ex. SHA-256), p är användarlösenordet och ' || ' betecknar sammankoppling
  • servern letar upp lösenordet i sin egen databas, beräknar om förväntat klientsvar och ser om det matchar vad klienten skickade

Lösenord är hemliga värden som passar i mänskliga hjärnor; som sådan kan de inte vara särskilt komplexa, och det är möjligt att bygga en stor ordbok som kommer att innehålla användarlösenordet med stor sannolikhet. Med "stort" menar jag "kan räknas upp med ett medelstort kluster om några veckor". För den aktuella diskussionen accepterar vi att en angripare kommer att kunna bryta ett enda lösenord genom att spendera några veckors beräkning. detta är den säkerhetsnivå som vi vill uppnå.

Föreställ dig en passiv angripare: angriparen avlyssnar men ändrar inte meddelandena. Han ser c och h (c || p) , så att han kan använda sitt kluster för att räkna upp potentiella lösenord tills en matchning hittas. Detta kommer att bli dyrt för honom. Om angriparen vill attackera två lösenord måste han göra jobbet två gånger . Angriparen vill att ska ha lite kostnadsdelning mellan de två attackinstanserna, med hjälp av förberäknade tabeller ("regnbågstabeller" är bara en typ av förberäknad tabell med optimerad lagring; men att bygga ett regnbågsbord kräver fortfarande att räkna upp hela ordlistan och hash varje lösenord). Den slumpmässiga utmaningen besegrar dock angriparen: eftersom varje instans innebär en ny utmaning kommer hashfunktionsingången att vara annorlunda för varje session, även om samma lösenord används. Således kan angriparen inte bygga användbara förberäknade tabeller, särskilt regnbågsbord.

Antag nu att angriparen blir aktiv. Istället för att helt enkelt följa meddelandena kommer han aktivt att ändra meddelanden, släppa några, duplicera andra eller infoga egna meddelanden. Angriparen kan nu fånga upp ett anslutningsförsök från klienten. Angriparen väljer och skickar sin egen utmaning ( c ') och väntar på klientsvaret ( h (c' || p) ). Observera att den sanna servern inte kontaktas; angriparen tappar bara anslutningen plötsligt omedelbart efter klientsvaret för att simulera ett godartat nätverksfel. I den här attackmodellen har angriparen gjort en stor förbättring: han har fortfarande en utmaning c ' och motsvarande svar, men utmaningen är ett värde som angriparen har valt efter eget tycke. Vad angriparen kommer att göra är att alltid servera samma utmaning c '. Genom att använda samma utmaning varje gång kan angriparen utföra förberäkningar: han kan bygga förberäknade tabeller (dvs. regnbågsbord) som använder den speciella "utmaningen". Nu kan angriparen angripa flera olika lösenord utan att ådra sig ordbokens uppräkningskostnad för var och en. Protokollet blir:

  • servern skickar en slumpmässig utmaning c
  • klienten väljer en nonce n (ska vara distinkt varje gång)
  • klienten skickar n || h (c || n || p)
  • servern beräknar om h (c || n || p) (med p från sin databas) och ser om detta värde matchar det som klienten skickade

Eftersom klienten innehåller ett nytt slumpmässigt värde ("nonce") i hashfunktionsingången för varje session, hashfunktionsinmatningen kommer att vara tydlig varje gång, även om angriparen kan välja utmaningen. Detta besegrar förberäknade (regnbågs) tabeller och återställer vår avsedda säkerhetsnivå.

En grov emulering av en unik nonce är användarnamnet. Två distinkta användare inom samma system har olika namn. Användaren behåller dock sitt namn när han byter lösenord. och två distinkta användare kan ha samma namn på två distinkta system (t.ex. varje Unix-liknande system har en "root" -användare). Så användarnamnet är inte en bra nonce (men det är ändå bättre än att inte ha någon client nonce alls).

Sammanfattningsvis handlar client nonce om att skydda klienten från en omspelningsattack (" server "som i själva verket är en angripare, som skickar samma utmaning till varje klient som han vill attackera). Detta behövs inte om utmaningen körs över en kanal som inkluderar stark serverautentisering (t.ex. SSL). Password Authenticated Key Exchange är avancerade protokoll som säkerställer ömsesidig lösenordsbaserad autentisering mellan klient och server, utan att behöva lite förhandsförtroende ("rotcertifikaten" när en SSL-klient autentiserar SSL-servercertifikatet) och skyddar mot aktiva och passiva angripare (inklusive "cluster-for-two-weeks" attack på ett enda lösenord, så det är strikt bättre än protokollet ovan, nonce eller no nonce).

Wow. Tack! Jag önskar att jag kunde rösta om det här igen.
Vid smältautentisering skickar servern en nonce och sedan skickar klienten samma nonce tillbaka. Verkar för mig att en klient nonce bara är användbar där servern tar vad klienten säger är nonce till nominellt värde istället för vad servern själv genererade? Om HTTP-anslutningen var vid liv verkar det för mig som om servern kunde veta vad den just skickade.
@paynes_bay Statelessness är ofta en önskvärd egenskap när du använder HTTP, särskilt av skälbarhet och hög tillgänglighet. Att inte skicka nonce tillbaka till servern skulle göra Digest Authentication stateful.
Av nyfikenhet - är det en viktig del av kundens nonce att servern spårar och registrerar var och en så att autentisering avvisas när en client nonce också återanvänds?
Bara för att göra det klart: Client nonce är särskilt för om angriparen är servern, eller hur?Annars, även om jag är över en säker kanal, vidarebefordrar någon / avlyssnare ändå helt enkelt begäran igen (omspelning) utan att behöva dekryptera den.Men för sådana slags attacker använder vi andra mekanismer, som en begäranräknare (per nonce) och sådant.
Bosh
2011-04-10 11:12:22 UTC
view on stackexchange narkive permalink

Låt mig försöka svara på köttet i din fråga: "Antar en sekund att angriparen inte vill delta i en man-i-mitten-attack och vill återställa autentiseringsdetaljerna, hur cnonce ge ytterligare skydd? "

Vanligtvis en klient inkluderar en nonce med begäran, men signerar hela begäran, inklusive nonce . Det betyder att även om angriparen avlyssnar ett meddelande mellan klienten och servern:

  1. En omspelningsattack fungerar inte (eftersom servern håller reda på klientens nonces).
  2. Angriparen kan inte bara skapa ett nytt meddelande med en ny klient nonce, eftersom den inte vet hur man signerar det nya meddelandet på lämpligt sätt (dvs. det saknar klienthemlighet eller privat nyckel).
Bryter inte en kund producerad nonce utmaningssvar-modellen? Vilken effekt har detta? En cnonce kan bekräfta att meddelandet inte har sett tidigare, men inte att det är nytt. Med andra ord öppnar systemet systemet för att tajma attacker där en angripare avlyssnar klienternas svar, förnekar service och återanvänder svaret.
Klienten kan inkludera en utgångstid. Om servern tar emot meddelandet efter utgången som ingår i det (undertecknade) meddelandet behandlas meddelandet på samma sätt som om signaturen var ogiltig.
@Justice detta introducerar problem med synkroniseringstid och så vidare. Hur vet servern klockans tid? Detta skulle vara lätt att förfalska.
En förfalskare kan inte förfalska en utgångstid eftersom utgångstiden är en del av meddelandet som signeras. I HTTP krävs inte klocksynkronisering eftersom klienten alltid får klocktider från servern. medan klienten kan beräkna varaktighet baserat på att mäta sin egen klocka, kommer den alltid att lägga till den varaktigheten till klocktiden från servern för att få en annan klocktid.
@Justice Jag insåg just att att använda servertiden och ändra den efter klienttid egentligen bara är ett annat sätt att implementera en server nonce. Så i själva verket är det bara att använda en server nonce att använda tid på detta sätt.
Jag tror att "signering" här refererar till ett slags äkthetsstämpel (som en HMAC eller sth).
OJ
2011-04-10 08:50:24 UTC
view on stackexchange narkive permalink

Jag tror att en bra idé skulle vara att läsa om hur nonce-värdet används i något som Oauth. Kort sagt, när en applikation som använder OAuth gör en begäran till en OAuth-stödd server, måste begäran innehålla en massa fält, varav två är tidsstämpel och nonce. Syftet med formuläret är uppenbart: det ger en indikation på tidsramen för att meddelandet skickades så att servern kan gissa bättre om meddelandet är gammalt eller inte. Det senare är uppenbarligen en massa slumpmässiga tecken / byte.

När hela OAuth-rubriken är hashad med konsumenthemligheten ingår båda dessa fält. Sedan har den signaturen som den bifogades till begäran (oavsett om det var frågeställningar eller HTTP-rubriker) och skickades vidare till servern. Den faktiska kroppen för begäran är inte hashad.

OAuth-servern bör hålla reda på den tidigare uppsättningen N nonce-värden för en given klient till se till att de inte återanvänds. Med tanke på att meddelandets kropp kan förändras (i princip inte ha någon effekt på hashen) är det viktigt att ha något annat som kommer att förändras (dvs. nonce) för att se till att förfrågningar är unika. Med tanke på HTTP: s öppna / klara text är det ganska viktigt.

Hjälper detta att klargöra dess syfte alls? (hoppas det :)).

Bryter inte OAuth utmaningssvarsmodellen genom att låta konsumenten skapa nonce? Är inte det dåligt? En användare cnonce kan bekräfta att meddelandet inte har sett tidigare, men inte att det är nytt. Med andra ord öppnar systemet systemet för att tajma attacker där en angripare avlyssnar klientens svar, nekar service och återanvänder svaret.
paynes_bay
2011-07-11 04:33:00 UTC
view on stackexchange narkive permalink

Enligt RFC 2617 skyddar parametrarna cnonce och nc mot valda klartextattacker. Hur skyddar detta mot sådana attacker?

Om Eve ändrar den nonce som servern skickar till klienten, vad har Eve fått? Eve kan inte generera h (lösenord || nonce) från h (lösenord || fake_nonce) och i teorin verkar det som om servern inte ska acceptera h (lösenord || fake_nonce) ändå eftersom servern borde veta vilken nonce den har utfärdats och vilken nonce den inte har.

Om du ställer en fråga bör den antagligen gå i en separat fråga snarare än i ett svar här.
Det är ungefär samma fråga som ställs här. Jag vill veta vad användningen av en kund nonce är. RFC2617 ger ett svar men det svaret är inte mycket vettigt för mig. Thomas Pornin gav också ett svar, men hans svar är inte mycket vettigt för mig heller enligt mitt svar på hans svar.
@paynes_bay välkommen till webbplatsen! Vänligen läs [FAQ] - svar är för, ja, * svarar * på frågan. Om du letar efter förtydliganden om ett annat svar fungerar kommentarer. Om du vill ha ytterligare information som inte omfattas av den ursprungliga frågan, fråga en annan!


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...