GUID有多么可靠的不可猜测?

前一段时间,我在一个Web应用程序,用户可以买票。 由于我们客户的stream程运行的方式,您购买的结果是一个带有票号的URL。

这些是在中东购买物业的门票,每张票可能价值约3,000,000美元。 显然,顺序整数会是一个坏主意。 我们使用GUID,因为它们基本上是不可猜测的,但是我的问题是:它们足够安全吗?

据我所知,.NET产生的GUID是完全伪随机的(除了一些不变的比特)。 但是,我不知道用什么algorithm来生成它们。

MSDN文档告诉我们Random是快速和不安全的, RNGCryptoServiceProvider是缓慢和安全的。 也就是说,假设某人可以投入足够的精力来预测Random的结果,而不是RNGCryptoServiceProvider

如果你看到足够长的GUID序列,是否有可能预测未来的期货? 如果是这样,你需要看多less?

[在我们的具体情况下,后来进行了人身安全检查 – 您必须出示您用来购买机票的护照 – 所以如果有人猜对了别人的GUID,那也不算太坏,所以我们没有出汗当时。 将GUID用作数据库密钥的便利性使其成为一种有用的数据types。]


编辑:

所以答案是“不够”。

在下面使用0xA3的答案,并从他链接到的问题的链接,下面的代码将生成密码随机的GUID是有效的RFC 4122的第4.4节 :

 static Guid MakeCryptoGuid() { // Get 16 cryptographically random bytes RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] data = new byte[16]; rng.GetBytes(data); // Mark it as a version 4 GUID data[7] = (byte)((data[7] | (byte)0x40) & (byte)0x4f); data[8] = (byte)((data[8] | (byte)0x80) & (byte)0xbf); return new Guid(data); } 

这比Guid.NewGuid()产生的GUID要慢得多,但是122位的“非常随机的”数据,它们是安全的,不可预知的。

当然,任何encryption随机文本都可以用于票号,但GUID非常方便。 🙂

和其他版本4的GUID一样,并不是唯一性的绝对保证,但几率是令人印象深刻的。 只要你有less于326,915,130,069,135,865(即sqrt(-2 * 2 ^ 122 * ln(0.99)) )GUID在同时玩,你可以超过99%肯定没有冲突。 换一种说法:如果像我的应用程序将溢出错误,如果你有比int.MaxValue几乎任何东西,你可以超过99.9999999999999999%肯定没有冲突(即e ^ – (((2 ^ 31-1)^ 2)/(2 * 2 ^ 122)) )。 这比陨石在实际应用的一秒钟内(即每1亿年1次 )不会在地球上消灭大部分生命大约多一千倍。

UUID / GUID由RFC4122指定。 虽然版本4的UUID是从随机数字创build的第6节对安全性作了明确的陈述:

不要以为UUID很难猜测 ; 它们不应该被用作安全性能力(例如仅仅拥有授予访问权限的标识符)。 一个可预测的随机数字来源将加剧这种情况。

关于GUID的随机性的一个很好的讨论也可以在这个问题中find:

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

这是如何不考虑安全问题的完美例子。 不幸的是,这是大多数开发人员对安全性的看法。

潜在的价值大约300万美元…他们是否足够安全?

不可以。可能会带来很多资源,可能会有每张票价为3M美元的问题 。 这种钱可以吸引资源丰富的人……一些非常认真的人。 使用依赖通用随机数生成器的任何东西都不是非常随意的…因此不是很安全。 这比密码学更令人迷惑。

身体安全检查…必须出示使用的护照…

再次,用这个数量的切达干酪…我可以给你任何你想要的护照。

…有可能预测未来的?…

是。 问题是…需要多长时间? …每一个单位的处理工作。

如果是这样,你需要看几个?

这取决于我所知道的关于他们的创作…操作系统,CPU等…我敢肯定,我可以在你们公司find一些人,他们有兴趣提供一些信息来换取…… 100,000美元,更可能,更less。

– 这可能看起来有些过于戏剧化,但是你说的是一笔巨额的资金,应该用一个严重的安全措施加以保护。 您需要一个安全咨询公司 ,可以帮助您select为此购买的encryption包。 你的客户应该能够通过他们的风险pipe理部门或他们的保险人提供帮助….如果没有,请find你自己的律师…… 你应该已经拥有的律师。

当然,这个GUID计划什么东西都不会出错,但是如果所有的梨形都是这样的话,那么你如何告诉所有的律师你的安全计划是一stream的,他们应该到别处去看看。 ..信任我,如果出了什么问题,你不想拿着手提包 。 这真的会吸引你。

编辑:在teedyay的评论…

从客户那里获得“从监狱免费”卡是一个好主意。 如果你告诉他们:“在微不足道的袭击中,我们可以确保安全……但是我们不是安全或密码公司。” 那么你的工作就完成了,客户就拿着这个包

GUID是由一个非常着名的algorithm生成的。 没有内置随机性的众所周知的值,例如网卡ID和时间戳被用来生成它们。

他们不应该被用作安全手段。

编辑

它似乎更新版本的GUID/UUIDalgorithm不再使用硬件地址的部分值,而是使用伪随机数。 但是这些并不是真正的随机性,仍然不应该用于安全性关键的应用程序。