随机是如何System.Guid.NewGuid()?

我知道这可能听起来像一个毫无意义的问题,但是听我说…

我基本上想知道,如果我可以信任GUID来产生一个值100%的时间是独一无二的,不可能预测的。

我基本上滚动我的login系统的网站,并想知道如果GUID足够安全的会话Cookie。

在评估答案时,任何关于如何生成GUID的背景都将非常感激。

感谢重复问题的链接,但是,我的问题是特定于.Net框架。

这是雷蒙德陈的一个很好的分解

没有固定长度的价值可以保证是100%独一无二的(只要说足够多的时间,让宇宙结束; -p) – 但它可能是非常非常不可能重复的。

我不能说连续数字的可预测性,但它是唯一的。 不过,我想你最好使用System.Security.Cryptography中的随机数生成器。 用一个单调递增的值(时间)绑定一个随机数来产生你唯一的密钥,你可以确定它是唯一的,不可预测的。

我不知道.NET,但UUIDalgorithm是相当精确的定义。

编辑:如果你看看适当的位(见维基百科条目),这应该解释使用哪个版本的UUID。

编辑2:一个红色标志为您使用的单词“安全”,这告诉我你最好使用明确的encryption方法。 例如,当在服务器上生成会话ID时,为什么不做一些简单的事情,如将MD5哈希应用于以下适当子集的串联:{客户端机器IP地址,按顺序递增的计数器,您select的固定秘密常量,你select的随机数发生器的输出等等。

假设System.Guid.NewGuid使用CoCreateGuid,它不是随机的。 从历史上看,用于创buildGUID的algorithm除了包含networking适配器的MAC地址以外,还有一些其他的东西,比如时间。 我不确定algorithm是否已经改变。 虽然它当然不是随机的,但保证是唯一的。

System.Guid.NewGuid()的文档没有保证随机性,所以当前的实现是基于一个随机数生成器(它是版本4的algorithm,这个版本是在版本1使用MAC地址;其他系统像苹果的OS X仍然使用algorithm的版本1)。

因此,虽然System.Guid.NewGuid()生成一个唯一值的概率非常高,但不能对其可预测性做任何假设,因为文档没有指定它。

我基本上想知道,如果我可以信任GUID来产生一个值100%的时间独一无二的,不可能预测的

我基本上滚动我的login系统的网站,并想知道如果GUID足够安全的会话Cookie

简短的回答: 没有 。 重要的是要注意独特随机是完全不同的。 如果你有一个通用计数器(比如在熟食店拿一个数字),这些数字是唯一的,但是完全可以预测的。

正如Bochu在上面指出的那样,Raymond在这里的post中提到: https ://blogs.msdn.microsoft.com/oldnewthing/20120523-00/?p=7553 /

GUID生成algorithm是为了唯一性而devise的。 它不是为随机性或不可预测性而devise的。 事实上,如果你看一下前面的讨论,你可以看到所谓的algorithm1是非随机的,完全可以预测的。 …即使是第4版的GUIDalgorithm(基本上说“将版本设置为4,并用随机或伪随机数填充其他所有数据”)也不能保证是不可预知的,因为该algorithm没有指定随机的质量号码发生器。

对于安全的随机数字,你需要一个密码安全的随机数字发生器。

顺便说一下,“滚动我自己的login系统”是一个安全的红旗 – 如果我没有指出这一点,我会失去信心。

根据定义,GUID在所有方面都是独一无二的。 曾经有一些GUID0生成例程产生了连续的GUID,但是那些是… Win98,我想,并且被微软固定。

您应该能够相信生成的GUID是唯一的,不会重复或重新生成。

(编辑:话虽如此,我们都明白,一串字母数字字符具有固定数量的排列,如果string是固定的长度,但在一个GUID的情况下排列的数量是经济*。)

(*该死,XKCD在哪里提出“天文数字”不够大?)