Zamierzam użyć UNIQUEIDENTIFIER
jako klucza dostępu, którego użytkownicy mogą używać do uzyskiwania dostępu do niektórych danych. W tym sensie klucz będzie działał jako hasło.
Muszę wygenerować wiele takich identyfikatorów jako część INSERT...SELECT
instrukcji. Ze względów architektonicznych chcę w tym przypadku wygenerować identyfikatory po stronie serwera.
Jak mogę wygenerować bezpiecznie losowy UNIQUEIDENTIFIER
? Pamiętaj, że NEWID
nie byłoby to wystarczająco losowe, ponieważ w ogóle nie obiecuje żadnych właściwości bezpieczeństwa. Szukam SQL Server odpowiednika System.Security.Cryptography.RandomNumberGenerator, ponieważ potrzebuję niemożliwych do odczytania identyfikatorów. Wszystko opiera się na CHECKSUM
, RAND
lub GETUTCDATE
nie byłoby również zakwalifikować.
4
. Ale fakt, że nie mam mocnych dowodów na to, że można je zgadywać, nie oznacza, że nie są. Nie mogę oprzeć tej decyzji bezpieczeństwa na tej obserwacji.Odpowiedzi:
Powinienem zrobić lewę, pomyślałbym.
CRYPT_GEN_RANDOM
źródło
Tylko moje dwa centy, ale to może nie być dobry pomysł. Parafrazując doskonałą serię Erica Lipperta na GUID ( część 1 , część 2 , część 3 ), akronimem jest GUID, a nie GSUID - globalny unikalny identyfikator, a nie globalny bezpieczny unikalny identyfikator.
Problem polega na tym, że gdy identyfikatory GUID są generowane w nieprzyjaznym zakresie, takim jak wszyscy używający NEWID (), wszystkie wartości wydają się być unikalne (cóż, w pewnym sensie, zobacz artykuł Erica, część 3). Ale jeśli wrogi byt wejdzie w ten zakres, mogą zarówno przewidzieć kolejny wygenerowany identyfikator GUID, jak i samodzielnie powodować kolizje.
Tworząc własną metodę generowania wartości przechowywanej w strukturze, która wygląda jak identyfikator GUID, zasadniczo stałeś się wrogim bytem. Zmieniłeś umowę GUID z unikalnego na losowy . Chociaż ktoś lepszy w matematyce niż ja mógłbym prawdopodobnie udowodnić, że wciąż jesteś wyjątkowy, to tylko w ramach metody twojej generacji. Jeśli połączysz te pseudo-GUID z GUID NEWID (), wszystkie zakłady są wyłączone.
Mówię, że to może nie być dobry pomysł tylko dlatego, że nie znam całego zakresu, w jaki używasz wartości. Jeśli jesteś jedyną jednostką generującą wartości (bez mieszania i dopasowywania) i / lub nie utrwalasz wartości i / lub nie przejmujesz się kolizjami, może to nie stanowić problemu. Jeśli którykolwiek z tych elementów jest nieprawdziwy, możesz dokonać ponownej oceny.
źródło
UNIQUEIDENTIFIER
to w większości przypadek. Po prostu wygodnie jest obsłużyć 16 bajtów przy użyciu tego typu. Myślę o tym jak o haśle. Jednak musi być wyjątkowy. Jestem pewien, że nigdy nie zobaczę kolizji (a nawet jeśli aplikacja się zawiesi - to też jest bezpieczne).Według https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newsequentialid-histrorybenefits-and-implementation/ , funkcja NEWID () po prostu otacza funkcję Windows CoCreateGuid, która zwraca identyfikator GUID w stylu v4 . I zgodnie z https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11 , od Windows 2000 w 1999 roku,
Powiedziałbym więc, że można uznać NEWID () za kryptograficznie bezpieczny - przynajmniej w zakresie 122 bitów entropii, które zapewnia.
źródło