昨天我问 是Guid上产生Windows2003年使用安全作为session Id? 答案结合与结合这篇文章 Guid是全球唯一的,但子的Guid不是 促使我思考的更换我的当前机制的使用Guid为session ID in cookies。

因为它的一位工作要做,改变我的决定来运行一个快速GUID测试我的Vista电脑看到,如果一个序列的Guid显然是确定的(是我担心的是,如果攻击者是能够得到一个序列的Guid产生通过我的服务器,他们将能够生成新的匹配的部分)。

在雷蒙德*陈的文章(其中引用的这个非常古老的规格 付和Guid 从1998年)GUID是由:

  • 60位的时间戳,
  • 48位的计算机的标识符,
  • 14位uniquifier,
  • 六位是固定的

去过,如果我生成10Guid第15ASCII字(不包括'-')有时间戳,下一个12ASCII字是计算机的标识,下一个3.5ASCII是随机的字符,并最后1.5字是固定的。

10Guid在我Vista电脑使用。网系统。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

唯一明显的模式,从一个快速目视检查,13ASCII的角色总是4.

我再次想,如果依靠的系统。Guid产生的伪随机session IDs是强大到足以保护网的应用程序,裂一届会议ID将是值得的,在大多数成千上万的美元?

更新:而不是使用GUID我现在的计划产生我的话ID的使用方法如下。我将384位随机数0x00byte string因此,它适用于在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);
有帮助吗?

解决方案

这不是一个完整的答案,但我可以告诉你,第13六位数字的总4,因为它表示,该版本的算法用于生成GUID(id est,v4);此外,我引述维基百科:

密码分析的WinAPI GUID 发电机显示,由于 序列的V4Guid是伪随机的, 鉴于初始状态的一个可能 预测到一个新的250 000Guid 返回的功能UuidCreate.这就是为什么Guid不应使用 在加密技术,例如,作为随机的钥匙。

其余篇文章,及其参考: http://en.wikipedia.org/wiki/Guid

-编辑--

从安全的角度来看,我会建议你产生您的话ID但是你觉得自己像,然后加密签名;这种方式可以包在任何你想要的信息,然后就打一个签署最终的可能问题之间的权衡的尺寸/力量的关键,并得到尺寸的cookie。Guid用作标识,但我只有依靠一个专用的密码技术的安全。

其他提示

我建议你使用 系统。安全。密码技术。RandomNumberGenerator.这是设计用于产生数字不能反向设计。Guid的动机是为了以独特的。你可以结合两者的GUID和安全随机数量,但是128位的安全随机的数量是永远不会有一个碰撞的做法。

一些注意事项:

  1. 我怀疑,任何执行Guid的目的是要cryptograhpically安全。(而这一假设能被证明文章链接,用于下一个项目。)
  2. 13ASCII角是一个符号的 什么样的算法被用于产生GUID.

如果你真的关注具有强session Id,然后也许是一个加密的安全的散列的东西,无法确定从机会成为你最好的办法。也许是产生一个 一次垫 从一些内部文件或数据来源甚至会的工作。

什么是你想要做什么?做你想做的只是一个来源的随机数?

检查了 random.orghotbits.许多许多年前,我有一个Java图书馆,将收集数从这些来源,并加入他们在一起,以得到一个很美丽的随机序列(虽然它假定两个地点不是在cahootz).

简短的答复是,没有guid不会强大到足以产生session id's如果你想阻止session id猜测和破裂。

出于同样的原因,为什么你不会想使用GUID作为一个AES的关键,你不想使用它们用于任何类型的敏感的标识。

GUID工作的非常好,为什么他们的目的是:一个数学上保证独特的ID永远不会重复。

即使破裂一届会议ID仅仅是价值$1000,想象一下如果那样做的100倍。现在你说的严重金光闪闪。

我知道这是一个简单的出路使用GUID的,但抵制,和处理疼痛,通过采取适当的预防措施,以充分安全的应用程序。你的用户会感谢你的。

它几乎是不可能得到的重复guid考虑的可能性的一个。这里有一些简单的数学事实

沙粒在世界75,000,000,000,000,000,000

数Guid340,282,366,920,938,463,463,374,607,431,770,000,000

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top