Насколько случайным является System.Guid.NewGuid ()? - PullRequest
47 голосов
/ 22 января 2009

Я знаю, что это может звучать как бессмысленный вопрос, но выслушай меня ...

Я хочу узнать, могу ли я доверять GUID для создания значения, которое будет уникальным в 100% случаев и его невозможно предсказать.

Я в основном использую систему входа в систему для веб-сайта и хочу знать, достаточно ли GUID для файлов cookie сеанса.

Любая справка о том, как генерируется GUID, будет высоко цениться при оценке ответов.

Спасибо за ссылки на дубликаты вопросов, однако мой вопрос относится к .Net framework.

Ответы [ 8 ]

28 голосов
/ 22 января 2009
9 голосов
/ 22 января 2009

Никакое значение фиксированной длины не может гарантировать 100% уникальности (просто назовите его достаточно раз, дайте или возьмите окончание юниверса ;-p) - но это может быть очень, очень, очень маловероятно, чтобы дублировать.

4 голосов
/ 22 января 2009

Я не могу говорить о предсказуемости последовательных чисел, но это будет уникально. Я думаю, что вам лучше использовать генератор случайных чисел из System.Security.Cryptography, хотя. Свяжите случайное число с монотонно увеличивающимся значением (временем), чтобы сгенерировать ваш уникальный ключ, и вы можете быть уверены, что он уникален и не предсказуем.

3 голосов
/ 22 января 2009

Документация для System.Guid.NewGuid () не дает никаких гарантий случайности, поэтому в то время как текущая реализация основана на генераторе случайных чисел (это версия 4 алгоритма, которая была разработана после того, как проблемы конфиденциальности возникли из версии 1, которая использовал MAC-адрес; другие системы, такие как Apple OS X, все еще используют версию 1 алгоритма).

Таким образом, хотя у вас очень высокая вероятность того, что System.Guid.NewGuid () сгенерирует уникальное значение, вы не можете делать никаких предположений относительно его предсказуемости, поскольку это не указано в документации.

3 голосов
/ 22 января 2009

Предполагая, что System.Guid.NewGuid использует CoCreateGuid, он не является случайным. Исторически алгоритм, используемый для создания руководств, заключался в том, чтобы включать MAC-адрес от сетевого адаптера, в дополнение к некоторым другим вещам, таким как время. Я не уверен, изменился ли алгоритм. Хотя это, конечно, не случайно, оно гарантированно будет уникальным.

3 голосов
/ 22 января 2009

Я не знаю о .NET, но алгоритм UUID определен довольно точно.

edit: если вы посмотрите на соответствующие биты (см. Статью в Википедии), это должно объяснить, какая версия UUID используется.

edit 2: красный флажок для использования слова «безопасный», который говорит мне, что вам лучше использовать хорошо определенный криптографический метод. Например, при генерации идентификаторов сеансов на сервере, почему бы просто не сделать что-то простое, например, применить хеш MD5 для объединения соответствующего подмножества следующего: {IP-адрес клиентского компьютера, счетчик последовательных приращений, фиксированная секретная константа на ваш выбор, вывод из генератора случайных чисел по вашему выбору и т. д.}?

2 голосов
/ 27 февраля 2017

Я в основном хочу знать, могу ли я доверять GUID для генерации значения который будет уникальным в 100% случаев, и его невозможно предсказать .

Я в основном использую систему входа на сайт и хочу знать , является ли GUID достаточно безопасным для файлов cookie сеанса .

Краткий ответ: совсем нет . Важно отметить, что уникальные и случайные совершенно разные. Если у вас был универсальный счетчик (например, взятие числа в гастрономе), эти числа уникальны, но полностью предсказуемы.

Как отмечает Бочу выше, пост Рэймонда здесь говорит об этом: https://blogs.msdn.microsoft.com/oldnewthing/20120523-00/?p=7553/

Алгоритм генерации GUID был разработан для уникальности. Он не был разработан для случайности или непредсказуемости. Действительно, если вы посмотрите на более раннее обсуждение, вы увидите, что так называемый алгоритм 1 не является случайным и полностью предсказуемым. ... Даже алгоритм GUID версии 4 (который в основном гласит: «установите версию на 4 и заполните все остальное случайными или псевдослучайными числами») не гарантированно будет непредсказуемым, поскольку алгоритм не определяет качество генератора случайных чисел.

Для безопасных случайных чисел вам нужен криографически безопасный генератор случайных чисел.

Кстати, «сворачивание моей собственной системы входа в систему» ​​- это красный флаг безопасности - я был бы упущен, если бы не указал на это.

1 голос
/ 22 января 2009

GUID по определению уникальны во всех отношениях. Когда-то были некоторые подпрограммы генерации GUID0, которые генерировали последовательные идентификаторы GUID, но это были проблемы в ... Win98, я думаю, и были исправлены Microsoft.

Вы должны быть уверены, что сгенерированный GUID уникален и никогда не повторяется и не восстанавливается.

(РЕДАКТИРОВАТЬ: сказав это, мы все понимаем, что строка буквенно-цифровых символов имеет фиксированное количество перестановок, если строка имеет фиксированную длину. Но в случае GUID количество перестановок экономично *.)

(* Черт возьми, где тот XKCD, где предлагаемые «астрономические» числа недостаточно велики?)

...