Jak bezpieczne jest używanie UUID do jednoznacznej identyfikacji czegoś (używam tego do plików przesyłanych na serwer)? Jak rozumiem, opiera się na liczbach losowych. Wydaje mi się jednak, że biorąc pod uwagę wystarczającą ilość czasu, w końcu powtórzy to samo, zupełnie przypadkiem. Czy istnieje lepszy system lub jakiś wzorzec łagodzący ten problem?
guid
uniqueidentifier
uuid
Jason
źródło
źródło
Odpowiedzi:
Bardzo bezpieczny:
Zastrzeżenie:
Źródło: Losowe prawdopodobieństwo UUID duplikatów sekcji artykułu z Wikipedii na temat Uniwersalnie unikatowych identyfikatorów (link prowadzi do wersji z grudnia 2016 r. Przed edycją przerobił sekcję).
Zobacz także bieżącą sekcję na ten sam temat w tym samym artykule o unikalnym identyfikatorze uniwersalnym, Kolizje .
źródło
Jeśli przez „wystarczająco dużo czasu” masz na myśli 100 lat i tworzysz je z szybkością miliarda na sekundę, to tak, masz 50% szansy na kolizję po 100 latach.
źródło
Istnieje więcej niż jeden typ identyfikatora UUID, więc „jak bezpieczny” zależy od typu (którego specyfikacje UUID nazywają „wersją”), którego używasz.
Wersja 1 to UUID oparty na czasie plus adres MAC. 128-bitowy zawiera 48-bitowy adres MAC karty sieciowej (który jest jednoznacznie przypisany przez producenta) i 60-bitowy zegar o rozdzielczości 100 nanosekund. Ten zegar jest zawijany w 3603 AD, więc te UUID są bezpieczne przynajmniej do tego czasu (chyba że potrzebujesz więcej niż 10 milionów nowych UUID na sekundę lub ktoś sklonuje twoją kartę sieciową). Mówię „przynajmniej”, ponieważ zegar zaczyna się 15 października 1582 r., Więc masz około 400 lat po tym, jak zegar się zawija, zanim istnieje nawet niewielka możliwość powielania.
Wersja 4 to losowy numer UUID. Jest sześć ustalonych bitów, a reszta identyfikatora UUID ma 122 bitów losowości. Zobacz Wikipedię lub inną analizę opisującą, jak mało prawdopodobne jest duplikowanie.
Wersja 3 wykorzystuje MD5, a wersja 5 używa SHA-1 do tworzenia tych 122-bitów zamiast generatora liczb losowych lub pseudolosowych. Jeśli chodzi o bezpieczeństwo, to jest tak, jakby wersja 4 była kwestią statystyczną (o ile upewnisz się, że algorytm przetwarzający jest zawsze unikalny).
Wersja 2 jest podobna do wersji 1, ale z mniejszym zegarem, więc będzie się owijała znacznie wcześniej. Ale ponieważ UUID w wersji 2 są przeznaczone dla DCE, nie powinieneś ich używać.
Są więc bezpieczne dla wszystkich praktycznych problemów. Jeśli nie czujesz się komfortowo, pozostawiając to prawdopodobieństwu (np. Jesteś osobą, która martwi się, że Ziemia zostanie zniszczona przez dużą asteroidę w swoim życiu), po prostu upewnij się, że używasz UUID w wersji 1, a gwarantuje to, że będzie unikalna ( za twojego życia, chyba że planujesz żyć po 3603 AD).
Dlaczego więc nie wszyscy po prostu używają identyfikatorów UUID w wersji 1? Jest tak, ponieważ identyfikatory UUID w wersji 1 ujawniają adres MAC maszyny, na której zostały wygenerowane, i można je przewidzieć - dwie rzeczy, które mogą mieć wpływ na bezpieczeństwo aplikacji korzystającej z tych identyfikatorów UUID.
źródło
Odpowiedź na to pytanie może zależeć w dużej mierze od wersji UUID.
Wiele generatorów UUID używa losowej liczby w wersji 4. Jednak wiele z nich używa Pseudo a Random Number Generator do ich generowania.
Jeśli do wygenerowania UUID zostanie użyty źle rozstawiony PRNG z krótkim okresem, powiedziałbym, że wcale nie jest zbyt bezpieczny.
Dlatego jest tak bezpieczny, jak algorytmy użyte do jego wygenerowania.
Z drugiej strony, jeśli znasz odpowiedź na te pytania, to uważam, że uuid w wersji 4 powinien być bardzo bezpieczny w użyciu. W rzeczywistości używam go do identyfikowania bloków w sieciowym systemie plików i do tej pory nie doszło do konfliktu.
W moim przypadku PRNG, którego używam, jest twisterem Mersenne i uważam na sposób, w jaki jest on rozprowadzany z wielu źródeł, w tym / dev / urandom. Mersenne Twister ma okres 2 ^ 19937 - 1. Minie bardzo dużo czasu, zanim zobaczę powtarzający się uuid.
źródło
Cytowanie z Wikipedii :
Dalej wyjaśnia dość dokładnie, jak naprawdę jest bezpieczny. Aby odpowiedzieć na twoje pytanie: Tak, jest wystarczająco bezpieczny.
źródło
Zgadzam się z innymi odpowiedziami. UUID są wystarczająco bezpieczne dla prawie wszystkich praktycznych celów 1 , a na pewno dla twojego.
Załóżmy jednak (hipotetycznie), że nie są.
Oto kilka podejść:
Użyj większego UUID. Na przykład zamiast 128 losowych bitów użyj 256 lub 512 lub ... Każdy bit dodany do UUID typu 4 zmniejszy prawdopodobieństwo kolizji o połowę, zakładając, że masz wiarygodne źródło entropii 2 .
Zbuduj scentralizowaną lub rozproszoną usługę, która generuje UUID i rejestruje każdą wydaną przez siebie. Za każdym razem, gdy generuje nowy, sprawdza, czy UUID nigdy wcześniej nie był wydawany. Taka usługa byłaby technicznie prosta do wdrożenia (myślę), gdybyśmy przyjęli, że osoby prowadzące tę usługę są absolutnie godne zaufania, nieprzekupne itp. Niestety nie są ... szczególnie, gdy istnieje możliwość ingerencji rządowych organizacji bezpieczeństwa. Tak, to podejście jest prawdopodobnie niepraktyczne i może być 3 niemożliwe w realnym świecie.
1 - Jeśli wyjątkowość UUID określi, czy rakiety nuklearne zostały wystrzelone w stolicy kraju, wielu współobywateli nie przekonałoby „prawdopodobieństwo bardzo niskie”. Stąd moje „prawie wszystkie” kwalifikacje.
2 - A oto pytanie filozoficzne. Czy coś jest naprawdę przypadkowego? Skąd mielibyśmy wiedzieć, gdyby tak nie było? Czy wszechświat, jaki znamy, jest symulacją? Czy istnieje Bóg, który mógłby „ulepszyć” prawa fizyki, aby zmienić wynik?
3 - Jeśli ktoś zna jakieś prace badawcze dotyczące tego problemu, prosimy o komentarz.
źródło
Schematy UUID generalnie wykorzystują nie tylko element pseudolosowy, ale także bieżący czas systemowy i jakiś często unikalny identyfikator sprzętu, jeśli jest dostępny, taki jak adres MAC sieci.
Cały sens używania UUID polega na tym, że ufasz, że wykonasz lepszą robotę, dostarczając unikalny identyfikator, niż sam byłbyś w stanie zrobić. Jest to to samo uzasadnienie, co do korzystania z zewnętrznej biblioteki kryptograficznej zamiast tworzenia własnej. Robienie tego samemu może być przyjemniejsze, ale zazwyczaj jest to mniej odpowiedzialne.
źródło
Robiłem to od lat. Nigdy nie napotykaj problemu.
Zazwyczaj konfiguruję swoje bazy danych, aby mieć jedną tabelę, która zawiera wszystkie klucze i zmodyfikowane daty i tak dalej. Nigdy nie spotkałem się z problemem zduplikowanych kluczy.
Jedyną wadą jest to, że kiedy piszesz zapytania, aby szybko znaleźć informacje, dużo kopiujesz i wklejasz klucze. Nie masz już łatwego do zapamiętania identyfikatora.
źródło
Oto fragment testowy umożliwiający przetestowanie jego unikatowości. zainspirowany komentarzem @ scalabl3
Jeśli masz szczęście, zaznacz pole wyboru, sprawdza tylko aktualnie wygenerowany identyfikator. Jeśli chcesz sprawdzić historię, pozostaw ją niezaznaczoną. Uwaga: w pewnym momencie możesz zabraknąć pamięci RAM, jeśli nie zaznaczysz jej. Próbowałem uczynić go przyjaznym dla procesora, abyś mógł w razie potrzeby szybko przerwać, po prostu naciśnij ponownie przycisk fragmentu uruchom lub opuść stronę.
źródło
Nie wiem, czy ma to dla Ciebie znaczenie, ale pamiętaj, że identyfikatory GUID są globalnie unikalne, ale podciągi GUID nie są .
źródło
W przypadku UUID4 sprawiam, że jest mniej więcej tyle samo dowodów, ile ziaren piasku w pudełku w kształcie sześcianu o bokach długości 360 000 km. To pudełko o bokach ~ 2 1/2 razy dłuższych niż średnica Jowisza.
Działa, aby ktoś mógł mi powiedzieć, czy zepsułem jednostki:
źródło