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

时间:2009-01-21 22:20:24

标签: .net random guid

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

我基本上想知道我是否可以信任GUID来生成一个在100%的时间内都是唯一且无法预测的值。

我基本上是在网站的登录系统上滚动,想知道GUID是否足够安全用于会话cookie。

在评估答案时,我们非常赞赏有关如何生成GUID的任何背景信息。

感谢您提供重复问题的链接,但我的问题仅针对.Net框架。

8 个答案:

答案 0 :(得分:28)

答案 1 :(得分:9)

没有固定长度的值可以保证100%唯一(只需调用足够的次数,给予或接受宇宙结束;-p) - 但它可能非常非常非常不可能重复。

答案 2 :(得分:4)

我无法谈论序号的可预测性,但它将是独一无二的。不过,我认为你最好使用System.Security.Cryptography中的随机数生成器。将随机数与单调递增值(时间)联系起来以生成唯一键,您可以确定它是唯一且不可预测的。

答案 3 :(得分:3)

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

编辑:如果你查看相应的位(参见维基百科条目),那应该解释正在使用哪个版本的UUID。

编辑2:使用“安全”一词的红色标志,告诉我最好使用明确定义的加密方法。例如,在服务器上生成会话ID时,为什么不执行简单的操作,例如将MD5哈希值应用于以下各项的适当子集的连接:{客户端计算机IP地址,顺序递增计数器,您选择的固定秘密常量,您选择的随机数生成器的输出等。}

答案 4 :(得分:3)

假设System.Guid.NewGuid使用CoCreateGuid,它根本不是随机的。从历史上看,用于创建guid的算法是除了时间等其他一些内容之外,还要合并来自网络适配器的MAC地址。我不确定算法是否已经改变。虽然它当然不是随机的,但它保证是独一无二的。

答案 5 :(得分:3)

System.Guid.NewGuid()的文档不保证随机性,因此当前实现基于随机数生成器(它是算法的第4版,这是在版本1出现隐私问题后设计的使用MAC地址;其他系统如Apple的OS X仍然使用算法的版本1)。

因此,虽然您有很高的System.Guid.NewGuid()概率生成唯一值,但您无法对其可预测性做任何假设,因为文档未指定。

答案 6 :(得分:2)

  

我基本上想知道我是否可以信任GUID来生成一个值   这将是 100%的独特时间,无法预测

     

我基本上在网站登录系统上滚动并想要   知道 GUID是否足够安全用于会话cookie

简短回答:完全没有。值得注意的是, unique random 完全不同。如果您有一个通用计数器(比如在熟食店拿一个号码),这些数字是唯一的,但完全可以预测。

正如Bochu上面所说,雷蒙德的帖子在这里谈到它: https://blogs.msdn.microsoft.com/oldnewthing/20120523-00/?p=7553/

  

GUID生成算法是为唯一性而设计的。 它不是为随机性或不可预测性而设计的。的确,如果你看一下之前的讨论,你会发现所谓的算法1是非随机的,完全可以预测。   ...   甚至版本4 GUID算法(基本上说"将版本设置为4并用随机或伪随机数填充其他所有内容")并不保证是不可预测的,因为算法没有指定质量随机数发生器。

对于安全的随机数,您需要一个密码安全的随机数生成器。

顺便说一句,"滚动我自己的登录系统"是一个安全的红旗 - 如果我没有指出这一点,我会失职。

答案 7 :(得分:1)

根据定义,GUID在所有方面都是独一无二的。曾经有过一些生成顺序GUID的GUID0生成例程,但这些问题在...... Win98中,我认为,并且被微软批评。

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

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

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