Насколько надежно угадываются GUID? - PullRequest
52 голосов
/ 06 сентября 2010

Некоторое время назад я работал над веб-приложением, где пользователи могли покупать билеты. Благодаря тому, как работали процессы нашего клиента, вы фактически получили в результате покупки URL-адрес с номером билета в нем.

Это были билеты на покупку недвижимости на Ближнем Востоке, и каждый билет потенциально стоил около 3 000 000 долларов. Очевидно, что выводить последовательные целые числа было бы плохой идеей. Мы использовали GUID, так как они в основном неосуществимы, но мой вопрос: достаточно ли они безопасны?

Насколько я понимаю, GUID, которые создает .NET, полностью псевдослучайны (за исключением нескольких неизменяемых битов). Однако я не знаю, какой алгоритм используется для их генерации.

Документация MSDN сообщает нам, что Random быстр и небезопасен, а RNGCryptoServiceProvider медленен и безопасен. То есть разумно предположить, что кто-то может приложить достаточно усилий, чтобы предсказать исход Random, но не RNGCryptoServiceProvider.

Если бы вы увидели достаточно длинную последовательность GUID, можно ли было бы прогнозировать фьючерсные? Если так, сколько вам нужно увидеть?

[В нашем конкретном случае позже были проведены проверки физической безопасности - вам нужно было предъявить паспорт, который вы использовали для покупки билета, - чтобы не было бы слишком плохо, если бы кто-то догадался о чём-то другом GUID, поэтому мы не потели в то время. Удобство использования GUID в качестве ключа базы данных сделало его полезным для использования типом данных.]


Edit:

Таким образом, ответ "недостаточно".

Используя приведенный ниже ответ 0xA3 и следуя ссылкам на вопрос , с которым он связан, следующий код сгенерирует криптографически случайный GUID, действительный для Раздел 4.4 RFC 4122 :

static Guid MakeCryptoGuid()
{
    // Get 16 cryptographically random bytes
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] data = new byte[16];
    rng.GetBytes(data);

    // Mark it as a version 4 GUID
    data[7] = (byte)((data[7] | (byte)0x40) & (byte)0x4f);
    data[8] = (byte)((data[8] | (byte)0x80) & (byte)0xbf);

    return new Guid(data);
}

Это создает GUID намного медленнее, чем Guid.NewGuid(), но с 122 битами "очень случайных" данных они безопасно непредсказуемы.

Конечно, любой криптографически случайный текст был бы полезен для номера заявки, но GUID довольно удобны. : -)

Как и в случае с другими GUID версии 4, нет абсолютной гарантии уникальности, но шансы впечатляют. Если у вас одновременно меньше 326 915 130 309 695 865 (т. Е. sqrt (-2 * 2 ^ 122 * ln (0.99)) ) в игре, вы можете быть более чем на 99% уверены, что коллизий нет. Другими словами, если ваше приложение будет иметь ошибки переполнения повсюду, если у вас есть более чем int.MaxValue практически всего, вы можете быть более чем на 99,99999999999999999% уверенными в отсутствии коллизий (то есть e ^ - ( ((2 ^ 31-1) ^ 2) / (2 * 2 ^ 122)) * * 1 048). Это примерно в тысячу раз увереннее, чем вы можете предположить, что метеорит не уничтожит большую часть жизни на Земле в течение одной секунды после запуска приложения (т. Е. один на 100 миллионов лет ).

Ответы [ 3 ]

31 голосов
/ 06 сентября 2010

UUID / GUID указываются как RFC4122 .Хотя UUID версии 4 создаются из случайных чисел Раздел 6 делает явное заявление о безопасности:

Не думайте, что UUID трудно угадать ;например, их не следует использовать в качестве средств защиты (идентификаторов, чье простое владение предоставляет доступ).Предсказуемый источник случайных чисел усугубит ситуацию.

Хорошее обсуждение случайности GUID также можно найти в этом вопросе:

Насколько случайным является System.Guid.NewGuid ()?(Взять два)

13 голосов
/ 07 сентября 2010

Это прекрасный пример того, как не думать о проблеме безопасности.К сожалению, именно так большинство разработчиков думают о безопасности ...

... потенциально стоимостью около $ 3 000 000 ... они достаточно безопасны? ...

Нет.Много ресурсов может быть использовано для решения проблемы, которая имеет возможную выплату 3 млн. Долл. США за билет .Такие деньги могут привлечь людей с большим количеством ресурсов ... некоторые очень серьезные люди.Использование всего, что основано на генераторе случайных чисел общего назначения, не очень случайно ... и поэтому не очень безопасно.Это больше запутывание, чем криптография.

... проверки физической безопасности ... пришлось представить использованный паспорт ...

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

... можно прогнозировать фьючерсы? ...

Да.Вопрос в том ... Сколько времени это займет? ... за какую-то единицу обработки.

... Если так, сколько вам нужно увидеть? ...

Это зависит от того, что я знаю об их создании ... ОС, процессоре и т. Д. ... и я уверен, что смогу найти кого-нибудь в вашей фирме, который был бы заинтересован в предоставлении некоторой информации в обмен на ... скажем, $ 100 000 или, более вероятно, меньше.

- Это может показаться слишком драматичным, но вы говорите о серьезной сумме денег, и она должна быть защищена серьезной защитой.Вам нужна консалтинговая фирма по безопасности , которая поможет вам выбрать пакет шифрования, который вы покупаете для этого.Ваш клиент должен быть в состоянии помочь через свой отдел управления рисками или через своего страховщика .... Если нет, обратитесь к своему собственному адвокату ... , который у вас уже должен быть .

Конечно, очень мало шансов, что что-то пойдет не так со схемой GUID, но если бы все прошло в форме груши ... Как вы собираетесь сказать всем этим юристам, что ваш план безопасности был на высшем уровне иони должны искать в другом месте? ... Поверьте мне, вы не хотите, чтобы держал сумку , если что-то пойдет не так.Это было бы очень плохо для вас.

Редактировать: В комментарии teedyay ...

Получение карты "Get Out of Jail Free" от клиента - это всегда хорошоидея.Если вы скажете им: «Мы можем обеспечить безопасность в случае тривиальных атак ... но мы не являемся фирмой, занимающейся вопросами безопасности или криптографии».тогда ваша работа выполнена, и клиент остается держа сумку .

8 голосов
/ 06 сентября 2010

GUID генерируется очень известным алгоритмом .Здесь нет встроенной случайности, так как для их генерации используются общеизвестные значения, такие как идентификаторы сетевых карт и временные метки.

Они не должны никогда использоваться в качестве средства безопасности.

РЕДАКТИРОВАТЬ

Кажется, более новая версия алгоритма GUID/UUID больше не использует аппаратный адрес для частей своих значений и вместо этого использует псевдослучайные числа.Но они не являются случайными и не должны использоваться для критически важных приложений.

...