sip*_*wiz 13 .net security random guid
昨天我问过在Windows 2003上生成的GUID是否可以安全地用作会话ID?结合本文的答案GUID是全局唯一的,但GUID的子字符串不会促使我考虑替换当前使用GUID作为cookie中的会话ID的机制.
因为进行这项改变需要做一些工作,所以我决定在我的Vista PC上运行一个快速GUID测试,以查看一系列GUID是否显然是确定性的(我担心的是,如果攻击者能够获得一系列的我的服务器生成的GUID,他们将能够生成新的匹配的GUID).
在Raymond Chen的文章中(引用了1998年非常旧的规范UUID和GUID ),GUID由以下内容组成:
如果我生成10个GUID,前15个ASCII字符(不包括' - ')是时间戳,接下来的12个ASCII字符是计算机标识符,接下来的3.5个ASCII字符是随机的,最后1.5个字符是固定的.
使用.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
Run Code Online (Sandbox Code Playgroud)
快速视觉检查中唯一可辨别的模式是第13个ASCII字符始终为4.
我再次想知道,依靠System.Guid来生成伪随机会话ID是否足以保护一个Web应用程序,其中破解会话ID最多价值数千美元?
更新:我现在计划使用以下方法生成会话ID,而不是使用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);
Run Code Online (Sandbox Code Playgroud)
Fac*_*Vir 10
这不是一个完整的答案,但我可以告诉你,第13个十六进制数字总是4,因为它表示用于生成GUID的算法的版本(id est,v4); 另外,我引用维基百科:
WinAPI GUID生成器的密码分析表明,由于V4 GUID的序列是伪随机的,因此在给定初始状态的情况下,可以预测函数UuidCreate返回的下一个250 000 GUID.这就是GUID不应该用于密码学的原因,例如,作为随机密钥.
本文的其余部分及其参考文献:http://en.wikipedia.org/wiki/Guid
- 编辑 -
从安全角度来看,我建议你生成你想要的会话ID,然后加密签名; 这样你可以打包你想要的任何信息,然后在最后打一个签名 - 可能的问题是你的密钥的大小/强度和cookie的结果大小之间的权衡.GUID作为ID很有用,但我只依靠专用的加密技术来保证安全性.
我建议你使用System.Security.Cryptography.RandomNumberGenerator.这旨在产生无法逆向工程的数字.Guid的动机是独特的.您可以将GUID和安全随机数组合在一起,但128位安全随机数在练习时永远不会发生冲突.
| 归档时间: |
|
| 查看次数: |
4086 次 |
| 最近记录: |