Вчера я спросил Are GUIDs generated on Windows 2003 safe to use as session IDs?, и ответ в сочетании с этой статьей GUIDs are globally unique, but substrings of GUIDs aren't побудил меня задуматься о замене моего текущего механизма использования GUID в качестве идентификаторов сеанса в файлах cookie.Как детерминированные являются .Net GUID?
Поскольку это небольшая работа, чтобы сделать это изменение, я решил запустить быстрый тест GUID на своем ПК с Vista, чтобы узнать, была ли последовательность идентификаторов GUID явно детерминированной (что меня беспокоит, если злоумышленник смог получите последовательность GUID, сгенерированную моим сервером, они смогут генерировать новые соответствующие).
В статье Реймонда Чена (который ссылается этот очень старый спецификации UUIDs and GUIDs с 1998 г.) GUID состоит из:
- 60 бит метки времени,
- 48 бит идентификатора компьютера,
- 14 биты uniquifier и
- шесть битов фиксированной
Идущий тем, что, если я произвожу 10 GUIDs й Первые 15 символов ASCII (исключая «-») являются меткой времени, следующие 12 символов ASCII являются идентификатором компьютера, следующие 3.5 символа ASCII являются случайными, а последние 1,5 символа фиксированы.
Получение 10 GUIDs на моем Vista, ПК, используя выходы .Net System.Guid.NewGuid():
b4e95ead-3619-4dc2-9102-cf7ab0efd927
a45ee719-decd-46b2-8355-7becbe406f74
9af68d75-35a0-4907-b6ab-f15e33acfe96
bed88fa3-3209-4a19-97dd-85d5428ea5f4
123cb39b-8d81-41c6-8894-f1257a8f7606
e2b1f6b1-5791-4a18-80a9-5dc668574ecb
c52aa660-2629-4659-bb83-5583081e5a1c
76eda32d-ceda-412e-8ade-30c47416e954
cbc4d45e-7281-40d2-9f90-00539b04fe98
be36524c-267c-4791-bc9e-3c20b29d7615
Единственный различимый узор из быстрого визуального осмотра является то, что 13-ASCII символов всегда 4.
Я снова не задавался вопросом, достаточно ли полагаться на System.Guid для генерации псевдослучайных идентификаторов сеансов, чтобы защитить веб-приложение, где взломать идентификатор сеанса будет стоить не более тысячи долларов?
Обновление: вместо использования GUID теперь я планирую сгенерировать идентификаторы сеанса, используя подход ниже. Я преобразовываю 384-битное случайное число в строку с байтом 0x00, чтобы он был подходящим для использования в HTTP-файле cookie.
RNGCryptoServiceProvider rngProvider = new RNGCryptoServiceProvider();
byte[] myKey = new byte[48];
rngProvider.GetBytes(myKey);
string sessionID = null;
myKey.ToList().ForEach(b => sessionID += b.ToString("x2"));
Console.WriteLine(sessionID);
GUID полностью детерминирован, иначе он не может быть G и U, это будет только идентификатор. –
GUID детерминирован в пространстве и времени; поэтому, если время, в которое оно было сгенерировано, было случайным (что является хорошей основой, так как вы получите для большинства псевдослучайных генераторов), GUID является, ну, псевдослучайным. – FacticiusVir
Когда вы имеете дело с компьютерными номерами, это никогда не будет случайным. Некоторое взаимодействие с человеком предпочтительнее, чтобы приблизить его к истинному случайному. Просто чтобы вы знали, что никогда не будет случайного числа. Если это так, человек узнает, что такое младенец. – user161433