Вчера я спросил Безопасно ли использовать идентификаторы GUID в Windows 2003 для использования в качестве идентификаторов сеансов? и ответ в сочетании с этой статьей Глобальные идентификаторы GUID уникальны, но подстроки идентификаторов GUID не являются побудил меня подумать о замене моего текущего механизма использования идентификаторов GUID в качестве идентификаторов сеансов в файлах cookie.
Поскольку для внесения этого изменения нужно немного поработать, я решил запустить быстрый тест GUID на моем компьютере с Vista, чтобы проверить, является ли последовательность GUID явно детерминированной (что меня беспокоит, так это то, что злоумышленник смог получить последовательность идентификаторов GUID, сгенерированных моим сервером, они смогут генерировать новые подходящие).
В статье Рэймонда Чена (которая ссылается на эту очень старую спецификацию UUID и GUID).
с 1998 г.) GUID состоит из:
- 60 бит отметки времени,
- 48 бит идентификатора компьютера,
- 14 битов Uniquifier и
- фиксированные шесть битов
Исходя из того, что если я сгенерирую 10 GUID, первые 15 символов ASCII (исключая '-') будут меткой времени, следующие 12 символов ASCII являются идентификатором компьютера, следующие 3,5 символа ASCII являются случайными, а последние 1,5 символа являются фиксированными .
Получение 10 GUID на моем компьютере с ОС 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, чтобы оно подходило для использования в файле cookie HTTP.
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);