sql >> Database >  >> NoSQL >> MongoDB

MongoDB-gegenereerde _ids gebruiken als geheime gegevens (bijv. OAuth-tokens)

Kortom, nee. Mongo ObjectIds zijn gemakkelijk te raden. Vooral bij hoge belasting zijn dit vaak opeenvolgende getallen, omdat tijdstempel, machine en proces-ID niet veranderen. Als je kijkt naar de structuur van Objectid , ze zijn samengesteld uit

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

Daarom hebben ze heel weinig willekeur. Ik zie vaak opeenvolgende id's in de database, bijvoorbeeld als een controlleractie een domeinobject schrijft, en een logitem snel achter elkaar.

Als het tijdstempel kan worden geraden en het machine-ID kan worden bepaald (wat het is tenzij je een enorm cluster hebt), zijn er nog maar vijf bytes over. Door naar een aantal gegenereerde id's te kijken, kan ik dat waarschijnlijk terugbrengen tot 50 processen, dus de effectieve entropie ligt ergens in het 28-bits bereik. Dit is nog steeds moeilijk te raden, maar het is veel te riskant voor een toegangstoken.

Gebruik in plaats daarvan een cryptografisch sterke pseudo-willekeurige nummergenerator en maak daar een token van. Bijvoorbeeld, in .NET, de RNGCryptoServiceProvider maakt het mogelijk willekeurige gegevens van willekeurige lengte te creëren.

Als kanttekening stel ik voor om een ​​extra cryptografische wrapper rond je OAuthTokens te hebben, om twee redenen:

a) U wilt snel ongeldige tokens kunnen bepalen. Een geldige cryptografische shell kan nog steeds een ongeldig token bevatten (een ingetrokken of verlopen subsidie), maar u hoeft niet elke keer de database te raken voor brute force-aanvallen. Ook de klant

b) Klanten kunnen tokens steeds opnieuw aanvragen. Hoewel het geen vereiste is, retourneren bijna alle systemen die ik ken elke keer verschillende tokens (ongeacht of ze zelfvaliderend zijn of niet). Meestal is dat omdat het token zelf een beperkte geldigheidsperiode heeft. Dat is niet dezelfde geldigheidsduur als de OAuth-beurs.

Wat u in de database echt wilt opslaan, is de subsidie, d.w.z. de toestemming die door een gebruiker aan een klant is gegeven. Als deze toekenning wordt verwijderd, worden alle tokens ongeldig. Elke keer een nieuw token invoegen is erg onhandig, omdat de gebruiker ze allemaal zou moeten verwijderen om de aanvraagsubsidie ​​effectief te verwijderen.



  1. Node.js + MongoDB:voeg er een in en retourneer het nieuw ingevoegde document

  2. Wat is er mis met MongoDB-query verwijderen met behulp van mongodb java voor subarray van document?

  3. Hoe een document te groeperen en selecteren dat overeenkomt met max binnen elke groep in MongoDB?

  4. Mongodb sorteert documenten op complexe berekende waarde