Насколько безопасны GUID-идентификаторы?

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

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

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

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

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

Я не знаю, какой алгоритм используется для их генерации.

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

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

Я не знаю, какой алгоритм используется для их генерации.

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

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

Разумно предположить, что кто-то может приложить достаточные усилия, чтобы предсказать результат Случайного , но не RNGCryptoServiceProvider .

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

Разумно предположить, что кто-то может приложить достаточные усилия, чтобы предсказать результат Случайного , но не RNGCryptoServiceProvider .

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

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


Редактировать:

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

Использование ответа 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 135 865 (т.е. sqrt (-2 * 2 ^ 122 * ln (0.99)) ) GUID в игре одновременно, вы можете быть более чем на 99% уверены, что нет столкновений. Другими словами, если ваше приложение будет иметь ошибки переполнения повсюду, если у вас больше int.MaxValue практически чего-либо, вы можете быть более чем на 99,99999999999999999% уверенны в отсутствии коллизий (то есть е ^ - (((2 ^ 31-1) ^ 2) / (2 * 2 ^ 122)) ). Это примерно в тысячу раз увереннее, чем вы можете предположить, что метеорит победил. t уничтожить большую часть жизни на Земле в течение одной секунды после запуска приложения (т. е. один раз в 100 миллионов лет ).

54
задан Community 23 May 2017 в 01:54
поделиться