Fråga:
Är GUIDs säkra för engångsmarknader?
Michael Haren
2010-11-30 21:25:29 UTC
view on stackexchange narkive permalink

Jag ser att många webbplatser använder GUID för återställning av lösenord, avbeställningsförfrågningar och andra former av unik identifikation.

Antagligen är de tilltalande eftersom de är lätta att generera, unika, icke-sekventiella .

Men är de tillräckligt säkra för dessa ändamål?

Det förefaller mig som om man får en GUID kan det vara möjligt att förutsäga efterföljande GUID eftersom (så långt som Jag vet) de är inte avsedda att vara kryptografiskt säkra ... eller är de?

Obs!

  • Jag pratar inte om webbplatser som använder en slumpmässig blob av gobbledygook kodad i base64.
  • Jag pratar om webbplatser som denna som verkar använda en rå guide:
    http://example.com/forgotPassword/?id=b4684ce3-ca5b-477f-8f4d -e05884a83d3c
Det beror på om du kan skapa / förutsäga vad som kommer att bli nästa GUID som används.
GUID-generering är ganska mycket deterministisk, med tanke på driftsvariablerna eller tillräckligt med tidigare GUID: er (kräver faktiskt inte så många ...)
Allt beror på exakt vad du menar med GUID och hur det genererades. Om man tittar på en URL kan det tyckas att den är i UUID-format, och du kan gissa att den genererades av Microsofts osäkra GUID-algoritm, och det skulle därför inte vara lämpligt för någon användning som det du föreslår. Men det kan ha genererats med hjälp av en bra kryptografiskt säker pseudoslumpmässig källa som / dev / random i Linux, i vilket fall det skulle vara bra.
@nealmcb: säker - detta är inte en direkt kritik av någon speciell webbplats. Istället försöker jag bekräfta min misstanke om att en sådan praxis (säker ID via guid) förmodligen inte är bra. Konsensus verkar vara att GUID är förutsägbara (men inte triviala att förutsäga), och säkrare medel bör användas.
@nealmcb, det är inte bara MS implementering, det är standarden för GUID.
@avid Vi håller med om att ingenting i RFC anger att även typ 4 "slumpmässiga" UUIDS är kryptografiskt säkra. Min enda poäng var att du kunde använda en bra implementering av RFC för säkerhetsändamål. T.ex. på en modern Linux-ruta med / dev / random kommer libuuid-biblioteket (och uuidgen-programmet) generera som standard mycket bra, oförutsägbara UUID. http://www.kernel.org/doc/man-pages/online/pages/man4/random.4.html Men det är säkert bättre för säkerhetsprogramvara att direkt använda ett API som är utformat specifikt för att ge kryptoslumpmässighet, eftersom någon kan slarvigt överföra koden.
Beror på hur de genereras.Många genererar dem säkert, se även https://news.ycombinator.com/item?id=10631806
Fem svar:
Thomas Pornin
2011-10-07 20:47:39 UTC
view on stackexchange narkive permalink

UUID-specifikationen beskriver flera "versioner" som är metoder för att skapa UUID. De flesta syftar till att säkerställa unikhet (det är UUID: s huvudpunkt) genom att använda t.ex. det aktuella datumet. Detta är effektivt men innebär att även om den genererade UUID är unik är de också förutsägbara vilket gör dem otillräckliga för vissa säkerhetsanvändningar.

"version 4" UUID-genereringsmetod (i avsnitt 4.4) ska dock använda en kryptografiskt stark slumptalsgenerator. 6 av de 128 bitarna är fixerade till ett konventionellt värde (för att indikera att detta är en version 4 UUID, nämligen), så detta lämnar 122 bitar från RNG.

Om underliggande RNG är säkert (t.ex. / dev / urandom på ett Linux / MacOS / * BSD-system eller CryptGenRandom () på Windows) då ges många genererade UUID, en angripare är inte tänkt att kunna förutsäga nästa med framgångssannolikhet högre än 2 -122 , vilket är tillräckligt litet för de flesta ändamål, inklusive startkoder för kärnmissiler. bitar garanterar unikhet med hög sannolikhet. Om du genererar många UUID av version 4 och ackumulerar dem kan du förvänta dig att stöta på din första kollision efter cirka 2 61 UUID - det är ungefär 2 miljarder miljarder; att bara lagra det antalet UUID skulle använda mer än 30 miljoner terabyte. Om du bara "10" tänker 10 12 sådana UUID (tusen miljarder, som kan lagras över 16 terabyte), är riskerna med att ha två identiska UUID bland dessa ungefär 9,4 * 10 -14 sup>, dvs cirka 700 tusen gånger mindre sannolikt än att vinna miljoner dollar i lotteriet.

Därför är UUID lämpliga för säkerhetsändamål om ( och bara om) de är "version 4" UUID genererade med en säker RNG.

Det står "UUID version 4 är avsedd för att generera UUID från verkligt slumpmässiga eller pseudoslumpmässiga nummer."(FWIW) ...
Xander
2010-11-30 21:49:29 UTC
view on stackexchange narkive permalink

Är de tillräckligt säkra för de ändamål som du beskrev? Enligt min mening generellt ja. Är de tillräckligt säkra i applikationer där säkerhet är ett viktigt problem? Nej. De genereras med en icke-slumpmässig algoritm, så de är inte på något sätt kryptografiskt slumpmässiga eller säkra.

Så för en avregistrerings- eller prenumerationsverifieringsfunktion ser jag verkligen inget säkerhetsproblem. För att identifiera en användare av en webbbankapplikation å andra sidan (eller egentligen till och med en lösenordsåterställning av en webbplats där identitet är värdefull) är GUID: er definitivt otillräckliga.

För mer information kanske du vill kolla in avsnitt 6 (Säkerhetsöverväganden) i RFC 4122 för GUID (eller universellt unika identifierare).

Syftet som han beskrev är exakt en lösenordsåterställningsfunktion. Även om det står klart att du säger att GUID inte * är * acceptabelt för säkerhetsanvändning, motsäger din första mening det.
Och jag håller med om att det är acceptabelt för en lösenordsåterställningsfunktion på de flesta webbplatser. Inte för banksidor eller webbplatser där det antas att en annan användares identitet är särskilt värdefullt, men de flesta webbplatser presenterar helt enkelt inte ett värdefullt mål för denna typ av attack eller en tillräckligt hög volym av lösenordsåterställningar för en attack av den här typen att arbeta i första hand.
Återställning av lösenord i de flesta organisationer som jag har arbetat ansågs definitivt på en lägre säkerhetsnivå än autentisering för transaktionswebbplatser etc. Ja, det är en vektor för attack, men de begränsningar som införts (tid, kunskap om hemlig information etc) och de kostnadsminskningar som gjorts för att förenkla självåterställning av lösenord (varje minskning av helpdesk-samtal sparar pengar) anses i allmänhet vara tillräckligt för en drivrutin.
Hmm, jag antar att det är sant, för webbplatser med lågt värde kan GUID vara tillräckligt bra. Men verkligen, som @massimo nämner i sitt svar, varför bry sig? Kryptorandomnummer är inte kostsamma, varken i dev-tid eller bearbetningstid.
Jag förstår. Jag håller med om att även om de är lämpliga för det aktuella ändamålet, är de fortfarande inte det bästa alternativet ur ett säkerhetsperspektiv.
goodguys_activate
2010-12-01 01:11:06 UTC
view on stackexchange narkive permalink

De är säkra i Windows 2000 eller senare. Din sårbarhet & risk beror på hur GUID genereras. Windows 2000 eller senare använder version 4 av GUID som är kryptografiskt säker.

För mer information se den här MSDN-länken och den här stack-overflow-frågan. (Tack till Jordan Rieger i kommentarerna)

Varför komplicera saker genom att kryptera ett inte så slumpmässigt nummer? Bättre och enklare att bara skapa ett verkligt oförutsägbart slumptal. Det är enkelt med / dev / random eller / dev / urandom på Linux. Vi behöver bara ett enkelt specifikt recept här för andra plattformar.
@nealmcb ibland är det inte möjligt att definiera slumpmässigheten för detta nummer (t.ex. ID kommer från ett backend-system från tredje part).Får inte använda OP
Enligt https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11, sedan Windows 2000 tillbaka 1999, "är de slumpmässiga bitarna för alla version 4 GUID: er inbyggda i Windowserhålls via kryptografiskt API för Windows CryptGenRandom eller motsvarande, samma källa som används för att generera kryptografiska nycklar ".Så jag skulle säga att du skulle kunna kalla dem kryptografiskt säkra - åtminstone i den utsträckning de 122 bitar entropi de tillhandahåller.
@JordanRieger Tack - uppdaterad.Jag försökte hitta det innehållande dokumentet "hem", men hindrades av MSDN-navigering.Är den här produktdokumentationen för ".NET" "Windows" eller något annat?
@CHICoder007 MSDN-navigering verkar trasig.Att följa sektionsnumren bakåt så långt som möjligt leder till https://msdn.microsoft.com/en-us/library/cc246025.aspx?f=255&MSPPError=-2147217396, en återvändsgränd.Det är definitivt Windows SDK-dokumentation av något slag.Jag hittade det genom att snubla på det här blogginlägget: http://joakim.uddholm.com/posts/predicting-net-guidnewguid.html (dokumentsidan kan ha uppdaterats sedan dess eftersom bloggreferenserna slutar anmärkning 9 när den faktiskt är slutnot 11.) Detta matchar också en ny felsökning / genomgång av Will Dean i https://stackoverflow.com/a/35384818/284704.
massimogentilini
2010-11-30 22:21:37 UTC
view on stackexchange narkive permalink

Om du använder ett gemensamt utvecklingsspråk är det inte så svårt att skapa en enhetsgenerator med unika slumpmässiga nummer med en korrekt kryptofunktion (vi pratar om 10 rader kod som finns tillgängliga som exempel på de vanligaste språken helt enkelt med Google) och så med en enkel ny guide är det i grund och botten latskap från utvecklarens synvinkel.

I det beskrivna scenariot är de "tillräckligt säkra", om guiden som skickas i glömt lösenordsfunktion har några grundläggande funktioner:

1) Det är verkligen ett one shot-värde som inte har något samband med användar-id, så när lösenordet har återställts kan det inte användas längre

2) Det har ett definierat tidsfönster för dess giltighet (du kan återställa lösenordet under de närmaste 30 minuterna eller något liknande)

Om du använder samma Guid kan du återställa lösenordet mer än en gång eller gissa guid och reset-lösenordet av användare som inte bad om lösenordsåterställning eller, som Avid beskriver i kommentaren, försöker få tillgång till återställningslösenord med s ome typ av omspelning bifogas då är det applikationsdesignen som är felaktig och att använda eller inte använda en Guid inte är det verkliga problemet.

Så om du inte har att göra med mycket känslig information kan en guide kanske fungera, men varför gör du inte saker på rätt sätt första gången och använder en ordentlig krypto-api för att skapa en säker slumpmässig sträng?

RegardsMassimo

Jag håller med om att den första delen av ditt svar att generera kryptoslumpnummer är extremt enkelt (och bör ta betydligt * mindre * än 10 LoC ...). I det beskrivna scenariot är de dock ** inte ** tillräckligt säkra, eftersom det inte finns någon garanti för att lösenordet återställs omedelbart: Det finns vanligtvis ett icke-trivialt giltighetsfönster.
Tänk till exempel på följande: ofta används detta schema för att skicka en länk till användarens förregistrerade e-postmeddelande, vilket gör det möjligt för direktåtkomst att återställa användarens lösenord. Som angripare skulle jag generera tillräckligt av dessa länkar / GUID tills jag kunde beräkna nästa batch på ett tillförlitligt sätt och sedan be om att skicka länken till mitt offer (i huvudsak få användaren att återställa lösenordet). Då skulle jag inte bry mig om åtkomst till användarens e-post, eftersom jag bara kunde gissa GUID / länk.
@Rory, Jag pratade om GUID: s inneboende gissbarhet (med tillräckligt med tidigare data), inte omspelningsattacker ...
yfeldblum
2011-10-07 22:29:32 UTC
view on stackexchange narkive permalink

Falska "GUID", som inte genereras av någon GUID-genereringsalgoritm, men som istället bara är 128 bitar (16 byte) som genereras av en kryptografiskt säker PRNG och som bara representeras konventionell GUID-kodning med hex-med bindestreck, är mestadels säkra för engångsmärken.

Du stöter dock på födelsedagsproblemet, eftersom förekomsten av en kollision är cirka 2 ^ -64 för 128- bit-tokens.

Bättre att använda 256-bitars eller 512-bitars tokens, där förekomsten av en kollision är runt 2 ^ -128 eller 2 ^ -256.

Detta är helt enkelt inte sant, åtminstone inte i allmänhet. Om du bygger på @Thomas's-svaret börjar det se mer troligt ut men är fortfarande mindre exakt än hans.
Det borde vara tydligare nu.


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 2.0-licensen som det distribueras under.
Loading...