MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Używanie MongoDB wygenerowanych _ids jako tajnych danych (np. tokenów OAuth)

Krótko mówiąc, nie. Mongo ObjectIds są łatwe do odgadnięcia. W szczególności przy dużym obciążeniu są to często kolejne liczby, ponieważ nie zmienia się znacznik czasu, id maszyny i procesu. Jeśli spojrzysz na strukturę Objectid , składają się z

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

Dlatego mają bardzo mało losowości. Często widzę kolejne identyfikatory w bazie danych, na przykład jeśli jakaś akcja kontrolera zapisuje obiekt domeny i wpis w dzienniku w krótkim odstępie czasu.

Jeśli znacznik czasu można odgadnąć, a identyfikator maszyny jest możliwy do ustalenia (co jest, chyba że masz ogromny klaster), pozostało tylko pięć bajtów. Patrząc na liczbę wygenerowanych identyfikatorów, prawdopodobnie mogę zredukować to do 50 procesów, więc efektywna entropia mieści się gdzieś w zakresie 28 bitów. To wciąż trudne do odgadnięcia, ale jest zbyt ryzykowne dla tokena dostępu.

Zamiast tego użyj kryptograficznie silnego generatora pseudolosowych liczb i utwórz z niego token. Na przykład w .NET RNGCryptoServiceProvider pozwala na tworzenie losowych danych o dowolnej długości.

Na marginesie proponuję mieć dodatkowe opakowanie kryptograficzne wokół tokenów OAuthToken z dwóch powodów:

a) Chcesz mieć możliwość szybkiego określenia nieprawidłowych tokenów. Prawidłowa powłoka kryptograficzna może nadal zawierać nieprawidłowy token (unieważniony lub wygasły grant), ale nie musisz za każdym razem trafiać do bazy danych w przypadku ataków typu brute force. Również klient

b) Klienci mogą wielokrotnie żądać tokenów. Chociaż nie jest to wymagane, prawie wszystkie systemy, które znam, za każdym razem zwracają różne tokeny (niezależnie od tego, czy są samo-walidujące się, czy nie). Zwykle dzieje się tak dlatego, że sam token ma ograniczony okres ważności. To nie jest ten sam okres ważności, który ma przyznanie OAuth.

W bazie danych to, co naprawdę chcesz przechowywać, to grant, czyli uprawnienie, które jakiś użytkownik nadał klientowi. Jeśli to przyznanie zostanie usunięte, wszystkie tokeny staną się nieważne. Wstawianie nowego tokena za każdym razem jest bardzo niewygodne, ponieważ użytkownik musiałby usunąć je wszystkie, aby skutecznie usunąć przyznanie aplikacji.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. zrozumieć system pamięci podręcznej MongoDB

  2. MongoDB GeoJSON Nie możesz wyodrębnić kluczy geograficznych z obiektu, zniekształconej geometrii? podczas wstawiania typu Wielokąt

  3. Skutecznie zliczaj procent występowania w MongoDB

  4. Konstruujesz spersonalizowany kanał informacyjny podobny do Facebooka:SQL, MongoDB?

  5. Zagregowane szeregi czasowe MongoDB