GUID的安全性是多么安全?

tee*_*yay 54 .net cryptography guid

不久之前,我在一个用户可以购买门票的网络应用程序上工作.由于我们客户的流程的运作方式,您购买后实际获得的是一个带有票号的URL.

这些是在中东购买房产的门票,每张门票的价值可能在300万美元左右.显然抛出顺序整数本来是个坏主意.我们使用GUID,因为它们基本上是不可知的,但我的问题是:它们足够安全吗?

据我所知,GUIDs .NET产生的是完全伪随机的(除了一些非变量位).但是,我不知道使用什么算法来生成它们.

MSDN文档告诉我们Random快速且不安全,并且RNGCryptoServiceProvider速度慢且安全.也就是说,假设有人可以投入足够的努力来预测结果Random,但不是RNGCryptoServiceProvider.

如果您看到足够长的GUID序列,是否可以预测期货?如果是这样,你需要看多少?

[在我们的特殊情况下,之后会进行身体安全检查 - 您必须出示用于购买机票的护照 - 所以如果有人猜到别人的GUID 就不会糟糕,所以我们没有出汗当时.使用GUID作为数据库密钥的便利性使其成为一种有用的数据类型.]


编辑:

所以答案是"不够".

使用下面的0xA3的答案,并跟随他链接的问题的链接,以下代码将生成一个加密随机GUID,该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);
}
Run Code Online (Sandbox Code Playgroud)

这比GUID产生的速度慢得多Guid.NewGuid(),但是使用122位"非常随机"的数据,它们是安全不可预测的.

当然,任何加密随机文本都可以用于票号,但GUID非常方便.:-)

与其他版本4 GUID一样,没有绝对的唯一性保证,但可能性令人印象深刻.只要您同时使用少于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亿年一次)应用的一秒钟内摧毁地球上大部分生命的陨石大约一千倍.

Dir*_*mar 33

UUID/GUID由RFC4122指定.虽然版本4 UUID是从随机数创建的,但第6节明确声明了安全性:

不要以为UUID难以猜测 ; 例如,它们不应被用作安全功能(仅仅拥有访问权限的标识符).可预测的随机数源将加剧这种情况.

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

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


Rus*_*sty 13

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

......潜在价值约300万美元......他们足够安全吗?......

不会.很多资源可以用来解决每张票可能支付3M的问题.这种钱可以吸引拥有大量资源的人......一些非常认真的人.使用依赖于通用随机数生成器的任何东西都不是非常随机的......因此不是很安全.它比密码术更混淆.

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

再次,在线上有一定量的切达干酪......我可以给你任何你想要的护照.

......有可能预测期货吗?......

是.问题是......需要多长时间?......每单位处理工作.

......如果是这样,你需要看多少?...

这取决于我对他们创作的了解......操作系统,CPU等......我相信我能在你的公司找到有兴趣提供一些信息的人,以换取... 100,000美元或者,更可能的是,更少.

-这一切似乎有点过于戏剧性,但你是在谈论一个严肃的金额,并应以严肃量的安全保护.您需要一家安全咨询公司,可以帮助您选择为此购买的加密套件.您的客户应该能够通过他们的风险管理部门或他们的保险公司提供帮助......如果没有,请找到您自己的律师...... 您应该拥有的律师.

当然,GUID计划出现问题的可能性很小,但如果确实出现了梨形状......你怎么告诉所有这些律师你的安全计划是一流的,他们应该去别处看看? ..托付我,如果出现问题,你不想拿着包.这真的很难找你.

编辑:关于teedyay的评论......

从客户那里获得"走出监狱免费"卡总是一个好主意.如果你告诉他们"我们可以在琐碎的攻击中使其安全......但我们不是安全或加密公司." 那么你的工作已经完成,客户端仍然拿着行李.


Jar*_*Par 8

GUIDs是由众所周知的算法生成的.内置无随机性,因为众所周知的值(如网卡ID和时间戳)用于生成它们.

永远不应将它们用作安全手段.

编辑

似乎较新版本的GUID/UUID算法不再使用硬件地址作为其部分值,而是使用伪随机数.但这些并非真正随机,仍不应用于安全关键应用程序.

  • 我依稀记得听说MAC地址组件因某些漏洞被替换了......我会挖掘一下. (6认同)
  • 好的,显然对 System.Guid 的调用最终以(通过调用 [CoCreateGuid](http://msdn.microsoft.com/en-us/library/ms688568%28VS.85%29.aspx))作为调用到 [UuidCreate](http://msdn.microsoft.com/en-us/library/Aa379205),其中不再包含网络适配器信息。 (2认同)
  • 自[Windows 2000](http://msdn.microsoft.com/en-us/library/aa446557.aspx)以来,Windows(和.NET)使用版本4 UUID,即GUID不再基于MAC地址或[安全原因]的时间戳(http://msdn.microsoft.com/en-us/library/aa379205%28v=VS.85%29.aspx) (2认同)
  • 这个评论实际上已经过时了 18 年。自 Windows 2000 以来,Windows 一直使用带有加密 RNG 的 UUID v4。 (2认同)