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.