2013-05-20 10 views
12

Czy istnieje różnica między SecureRandom.uuid ruby ​​(Ruby 1.9.3) i klejnot UUID? Czy UUID jest "starym" sposobem robienia rzeczy?SecureRandom.uuid vs UUID gem

Z dokumentów wiem, że klejnot jest bardziej "bezpieczny", aby być prawdziwym unikatowym UUID, podczas gdy SecureRandom.uuid jest bardziej losowym ciągiem, który ma większe szanse, że nie będzie unikatowy. Ponadto wydaje się, że UUID zezwala na zachowanie trwałości na podstawie plików, aby pomóc w tym.

Tak więc miałem nadzieję usłyszeć od niektórych ludzi, którzy mają do tego lepszy wgląd niż ja.

+0

"Większa szansa", że nie jest unikalna, jest wysoce nieprawdopodobna w praktyce. * Myślę, że * klej UUID to v1 uuids, a tutaj jest coś niejasno powiązanego (ale nie odpowiedź): http://stackoverflow.com/questions/703035/when-are-youy-forlyforced-to-use- uuid-as-part-of-the-design/786541 # 786541 –

+2

To właściwie dość dobrze odpowiada na pytanie. Wersja ruby ​​to v4, a gem to v1. Prawdopodobieństwo, że wpadnę na dwa identyczne UUID przy użyciu metody ruby ​​jest niewielkie.Użycie v1 jest w rzeczywistości zerowe w mojej konfiguracji (chyba że wygenerowałem 256 exobajtów uuids). "Szczerze mówiąc, w pojedynczej aplikacji bez złośliwych aktorów, wyginięcie całego życia na Ziemi nastąpi na długo przed kolizją, nawet na UUID w wersji 4, nawet jeśli generujesz sporo UUID na sekundę." –

+1

Również UUID v1 opierają się na unikalności adresów MAC. W mocno zwirtualizowanym świecie możesz być zaskoczony, że wyjątkowość adresu mac wirtualnej karty sieciowej może nie być tak silną gwarancją, jak losowe bity pozyskane z 'OpenSSL :: Random' – dbenhur

Odpowiedz

6

Istnieje kilka metod generowania identyfikatorów UUID.

Wikipedia dobrze ilustruje je.

http://en.wikipedia.org/wiki/Universally_unique_identifier

v4 UUID:

Kluczową ideą o losowy, czy to jest rzeczywiście bardzo trudno wygenerować przy odnoszeniu się do szyfrowania. Większość generatorów liczb losowych to formuła matematyczna, która wymaga LOOK losowego i działa dobrze dla większości aplikacji. Wiele programów użyje $ pid | czas, aby wygenerować losowy materiał siewny.

Co, nie jest zbyt obiecujące ... Wiem, o której godzinie wygenerowano żądanie i istnieje tylko 65 534 zestawów. Mogę odgadnąć losowe nasienie z tego.

Tak więc, jeśli zaszczepiasz generator liczb UUIDv4 dokładnie w tym samym czasie (ta sama sekunda) z $ pid | time() na 100 maszynach z numerami PID, wtedy masz (domyślam się) 100/65536 szansę na duplikację. Można to zrobić dość łatwo jak to

for MACH in `cat machine_list`; do ; ssh $MACH -c "restart something" & ; done 

SecureRandom:

Kod z SecureRandom, dociera OpenSSL/dev/urandom, potem win32 ...

Podczas czytania z/dev/urandom, jest bardzo losowy, ale jeśli w systemie nie ma wystarczającej ilości chaosu, urandom zrobi wszystko, aby dostarczyć losowe dane. Podczas odczytu z/dev/random, jest to "BŁĘDNE losowe, a jeśli nie ma wystarczającej ilości chaosu,/dev/random będzie blokować.

UUID:

UUID gem wykorzystuje rand()

r = [rand(0x100000000)].pack "N" 

adresu MAC.

UUID również nie dostarcza v4 UUID :)

Praktycznie, jeśli kiedykolwiek ma md5 lub UUID kolizji kupuję bilet na loterii!

+0

Chociaż chodzi o generator liczb losowych JavaScript, jest to bardzo pouczający artykuł na temat "przypadkowego" UUID. https://medium.com/@betable/tifu-by-using-math-random-f1c308c4fd9d#.k2ah5kjq1 – Daniel