Kort sagt, nej. Mongo ObjectIds
är lätta att gissa. I synnerhet under hög belastning är dessa ofta på varandra följande nummer, eftersom tidsstämpel, maskin och process-id inte ändras. Om du tittar på strukturen för Objectid
, de är sammansatta av
a 4-byte timestamp,
a 3-byte machine identifier,
a 2-byte process id, and
a 3-byte counter, starting with a random value.
Därför har de väldigt lite slumpmässighet. Jag ser ofta på varandra följande ID i databasen, till exempel om någon kontrollåtgärd skriver ett domänobjekt och en loggpost i snabb följd.
Om tidsstämpeln kan gissas och maskin-id är bestämbart (vilket det är om du inte har ett stort kluster), finns det bara fem byte kvar. Genom att titta på ett antal genererade ID kan jag förmodligen minska det till 50 processer så den effektiva entropin är någonstans i 28-bitarsintervallet. Detta är fortfarande svårt att gissa, men det är alldeles för riskabelt för en åtkomsttoken.
Använd en kryptografiskt stark pseudoslumptalsgenerator istället och skapa en token från den. Till exempel, i .NET, RNGCryptoServiceProvider
gör det möjligt att skapa slumpmässiga data med godtycklig längd.
Som en anmärkning föreslår jag att du har ytterligare ett kryptografiskt omslag runt dina OAuthTokens, av två anledningar:
a) Du vill snabbt kunna fastställa ogiltiga tokens. Ett giltigt kryptografiskt skal kan fortfarande innehålla en ogiltig token (ett återkallat eller utgånget tillstånd), men du behöver inte träffa databasen på brute force-attacker varje gång. Även klienten
b) Kunder kan begära tokens om och om igen. Även om det inte är ett krav, returnerar nästan alla system jag känner olika tokens varje gång (oavsett om de är självvaliderande eller inte). Vanligtvis beror det på att själva token har en begränsad giltighetstid. Det är inte samma giltighetstid som OAuth-bidraget har.
I databasen är det du verkligen vill lagra tillståndet, det vill säga tillståndet som gavs av en användare till en klient. Om detta anslag tas bort blir alla tokens ogiltiga. Att infoga en ny token varje gång är väldigt obekväm eftersom användaren måste ta bort dem alla för att effektivt ta bort ansökan.