sql >> Database teknologi >  >> NoSQL >> MongoDB

Brug af MongoDB-genererede _ids som hemmelige data (f.eks. OAuth-tokens)

Kort sagt nej. Mongo ObjectIds er nemme at gætte. Især under høj belastning er disse ofte fortløbende tal, fordi tidsstempel, maskine og proces-id ikke ændres. Hvis du ser på strukturen af ​​Objectid , de er sammensat af

a 4-byte timestamp, 
a 3-byte machine identifier, 
a 2-byte process id, and 
a 3-byte counter, starting with a random value.

Derfor har de meget lidt tilfældighed. Jeg ser ofte fortløbende id'er i databasen, for eksempel hvis en controllerhandling skriver et domæneobjekt og en logpost i hurtig rækkefølge.

Hvis tidsstemplet kan gættes, og maskin-id'et kan bestemmes (hvilket det er, medmindre du har en enorm klynge), er der kun fem bytes tilbage. Ved at se på et antal genererede id'er kan jeg sandsynligvis reducere det til 50 processer, så den effektive entropi er et sted i 28 bit-området. Dette er stadig svært at gætte, men det er alt for risikabelt til et adgangstoken.

Brug en kryptografisk stærk pseudo-tilfældig talgenerator i stedet og opret et token ud fra det. For eksempel i .NET, RNGCryptoServiceProvider gør det muligt at oprette tilfældige data i vilkårlig længde.

Som en sidenote foreslår jeg at have en ekstra kryptografisk indpakning omkring dine OAuthTokens af to grunde:

a) Du ønsker hurtigt at kunne bestemme ugyldige tokens. En gyldig kryptografisk shell kan stadig indeholde et ugyldigt token (en tilbagekaldt eller udløbet bevilling), men du behøver ikke at ramme databasen om brute force-angreb hver gang. Også klienten

b) Kunder kan anmode om tokens igen og igen. Selvom det ikke er et krav, returnerer næsten alle systemer, jeg kender, forskellige tokens hver gang (uanset om de er selvvaliderende eller ej). Normalt skyldes det, at selve tokenet har en begrænset gyldighedsperiode. Det er ikke den samme gyldighedsperiode, som OAuth-bevillingen har.

I databasen er det, du virkelig ønsker at gemme, bevillingen, dvs. den tilladelse, der blev givet af en bruger til en klient. Hvis denne bevilling fjernes, bliver alle tokens ugyldige. Det er meget upraktisk at indsætte et nyt token hver gang, fordi brugeren skulle slette dem alle for effektivt at fjerne ansøgningsbevillingen.



  1. Aggregationsfilter efter $lookup

  2. Brug Aggregate med $group i mongodb

  3. 2 måder at slette en samling i MongoDB

  4. MongoDB - Tilladelse nægtet til socket:/tmp/mongodb-27017.sock