因为更改需要一些工作,所以我决定在我的Vista PC上运行快速的GUID测试,看看GUID序列是否明显具有确定性(我担心的是,如果攻击者能够获得由我的服务器生成的GUID序列,他们将能够生成新的匹配项)。
根据Raymond Chen的文章(引用自1998年的UUID和GUID规范),GUID由以下组成:
- 60位时间戳,
- 48位计算机标识符,
- 14位唯一标识符,
- 六位固定值
使用.Net System.Guid.NewGuid()在我的Vista PC上获取10个GUID的结果为:
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生成伪随机会话ID是否足够强大,能够保护一个攻击者最多只可能盗取几千美元价值的网络应用程序?
更新:与其使用GUID,我现在计划使用以下方法生成我的会话ID。我将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);