2014-06-11 11 views
5

Zgodnie z Microsoft's documentation on NEWSEQUENTIALID, wyjście NEWSEQUENTIALID jest przewidywalne. Ale jak przewidywalne jest przewidywalne? Załóżmy, że mam identyfikator GUID, który został wygenerowany przez NEWSEQUENTIALID, jak trudno byłoby:Jak przewidywalny jest NEWSEQUENTIALID?

  • Oblicz następną wartość?
  • Obliczyć poprzednią wartość?
  • Oblicz pierwszą wartość?
  • Oblicz pierwszą wartość, nawet nie znając żadnych identyfikatorów GUID?
  • Oblicz liczbę rzędów? Na przykład. podczas korzystania z liczb całkowitych, /order?id=842 mówi mi, że w aplikacji jest 842 zamówień.

Poniżej znajduje się kilka podstawowych informacji o tym, co robię i jakie są różne kompromisy.

Jedną z zalet zabezpieczenia GUID w postaci liczb całkowitych jako kluczy podstawowych jest to, że identyfikatory GUID są trudne do odgadnięcia. Na przykład. powiedzmy, że haker widzi adres URL taki jak /user?id=845, mógłby spróbować uzyskać dostęp do /user?id=0, ponieważ jest prawdopodobne, że pierwszy użytkownik w bazie danych jest administratorem. Co więcej, haker może iterować ponad /user?id=0..1..2, aby szybko zebrać wszystkich użytkowników.

Podobnie, wadą liczb całkowitych z jest to, że powodują one wyciek informacji. /order?id=482 mówi mi, że od momentu wdrożenia sklep internetowy ma 482 zamówienia.

Niestety, używanie identyfikatorów GUID jako kluczy podstawowych ma znane wady w zakresie wydajności . W tym celu SQL Server wprowadził funkcję NEWSEQUENTIALID. W tym pytaniu chciałbym się dowiedzieć, jak przewidywalny jest wynik NEWSEQUENTIALID.

Odpowiedz

3

Podstawową funkcją OS jest UuidCreateSequential. Wartość pochodzi z adresu MAC karty sieciowej i adresu per-os-boot incremental value. Zobacz RFC4122. Program SQL Server wykonuje pewną liczbę operacji, aby odpowiednio sortować wyniki. Tak więc wartość jest w pewnym sensie wysoce przewidywalna. W szczególności, jeśli znasz wartość, możesz od razu przewidzieć zakres podobnej wartości.

Jednak nie można przewidzieć odpowiednika id=0 ani nie można przewidzieć, że 52DE358F-45F1-E311-93EA-00269E58F20D oznacza, że ​​sklep sprzedał co najmniej 482 pozycji.

Jedyna "zatwierdzona" generacja losowa to CRYPT_GEN_RANDOM (która owija CryptGenRandom), ale jest to oczywiście okropny kluczowy kandydat.

+0

Doskonała i dokładna reakcja! –

1

• Oblicz następną wartość? Tak

Microsoft mówi:

Jeśli prywatność jest problemem, nie należy używać tej funkcji. Możliwe jest odgadnięcie wartości następnego wygenerowanego identyfikatora GUID, a zatem danych dostępu powiązanych z tym identyfikatorem GUID.

SO to możliwość uzyskania następnej wartości. Nie znajduję informacji, jeśli możliwe jest uzyskanie prevoius.

od: http://msdn.microsoft.com/en-us/library/ms189786.aspx

EDIT: Jeszcze kilka słów o NEWSEQUENTIALID i bezpieczeństwo: http://vadivel.blogspot.com/2007/09/newid-vs-newsequentialid.html

Edit: NewSequentialID zawiera adres serwera MAC (lub jednego z nich), dlatego znając sekwencyjnego identyfikatora daje potencjalna informacja o napastniku, która może być przydatna jako część ataku bezpieczeństwa lub DoS. od: Are there any downsides to using NewSequentialID?

+0

Dziękuję za odpowiedź. Wiem, że NEWSEQUENTIALID jest przewidywalny.W tym pytaniu chciałbym się dowiedzieć, * jak * można przewidzieć. –

4

W większości przypadków można przewidzieć następną wartość newsequentialid, pobierając bieżącą wartość i dodając jedną do pierwszej pary heksadecymalnej.

Innymi słowy

1E 29E599-45F1-E311-80CA-00155D008B1C

następuje

1F 29E599-45F1-E311- 80CA-00155D008B1C

następuje

29E599-45F1-E311-80CA-00155D008B1C

Zdarza się, że sekwencja zostanie wznowione od nowej wartości.

Tak, to jest bardzo przewidywalny

NewSequentialID jest owinięcie wokół funkcji okien UuidCreateSequential

+0

Zaobserwowałem podobne zachowanie w mojej bazie danych. Seria rzędów wydaje się podążać za wzorcem, ale potem nagle przeskakuje do nowej wartości. Czy można również odgadnąć tę nową wartość? –

2

Można spróbować tego kodu:

DECLARE @tbl TABLE (
    PK uniqueidentifier DEFAULT NEWSEQUENTIALID(), 
    Num int 
) 
INSERT INTO @tbl(Num) values(1),(2),(3),(4),(5) 
select * from @tbl 

Na moim komputerze w tym czasie jest wynikiem:

PK          Num 
52DE358F-45F1-E311-93EA-00269E58F20D 1 
53DE358F-45F1-E311-93EA-00269E58F20D 2 
54DE358F-45F1-E311-93EA-00269E58F20D 3 
55DE358F-45F1-E311-93EA-00269E58F20D 4 
56DE358F-45F1-E311-93EA-00269E58F20D 5 

Powinieneś tego spróbować Ral razy w innym czasie/czasie, aby interpolować zachowanie. Próbowałem go uruchomić kilka razy i pierwsza część zmienia się za każdym razem (widzisz w wynikach: 52 ..., 53 ..., 54 ..., itp.). Czekałem trochę czasu, aby to sprawdzić, a po pewnym czasie również druga część została zwiększona. Przypuszczam, że inkantacja trwa nadal we wszystkich częściach. Zasadniczo wygląda to na proste przekształcenie +=1 w Guida.

EDIT:

Jeśli chcesz GUID sekwencyjne i chcesz mieć kontrolę nad wartościami, można użyć Sequences.

Przykładowy kod:

select cast(cast(next value for [dbo].[MySequence] as varbinary(max)) as uniqueidentifier) 
+0

Jaki jest pożytek z tego? Dlaczego nie po prostu użyć 1,2,3,4,5? –