Некоторое время назад я работал над веб-приложением, где пользователи могли покупать билеты. Из-за того, как работали процессы нашего клиента, в результате вашей покупки вы получили 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 миллионов лет ).