Насколько безопасно unguessable являются GUID?

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

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

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

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

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

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


Edit:

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

Используя 0xA3 ниже, и следуя ссылкам из question, с которыми он связан, следующий код будет генерировать криптографически случайный идентификатор 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 очень удобны.: -)

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

Ответы

Ответ 1

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

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

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

Как Random является System.Guid.NewGuid()? (Возьмите два)

Ответ 2

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

... потенциально стоит 3 000 000 долларов... они достаточно безопасны?...

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

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

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

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

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

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

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

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

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

Изменить: на комментарий teedyay...

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

Ответ 3

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

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

EDIT

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