GUID是否可信赖用于安全,如果系统可以强制生成许多已知的GUID,它们是否可预测?

12
为了开始并定义guid,我使用了一个.NET框架的Guid。这是一个假设性的情况。当用户执行特定操作时,会生成guids。每个用户都可以看到自己的guids。如果一个用户知道另一个用户的任何一个guid,就会产生安全威胁。
如果我们假设用户没有办法窃取另一个用户的guid,并且只能猜测,那么这个系统有多安全呢?
我理解,盲目地猜测guids是不可能的。即使他们有一百万个成功值,他们仍然只有10^20次成功猜测的机会。
我的担忧在于guid预测。如果一个用户生成大量请求,查看他得到的guids,并知道.NET guid生成公式,那么他是否可以大大提高猜测的几率?这些几率能够降低到成为安全隐患的程度吗?如果是的话,应该如何以独特的、不可预测的方式生成密钥?
我要求任何提及猜测/冲突几率的人添加一些确切的含义。无论是定义几率的精确数字,还是像“它可以用于存储帐户数据,但不能用于敏感数据”之类的东西。
编辑:这个问题似乎涉及到我最初想探讨的领域:GUID是否是(临时)加密的好密钥?

1
Guid并不是唯一的,因此理论上两个用户可能拥有相同的Guid。 - Aaron McIver
可能类似于https://dev59.com/glLTa4cB1Zd3GeqPeOC7 - Eugene Mayevski 'Callback
对于正确生成的随机 GUID,碰撞的可能性足够低,以保证实践中的唯一性。 - CodesInChaos
1
@Aaron,GUID在技术上并不是唯一的,但它们在统计学上是唯一的。有3.4×10^38个可能的GUID...每个可观测宇宙中的星星都可以统计上拥有6.8×10^15个GUID。任何两个人拥有相同GUID的概率极其微小。 - guildsbounty
@Eugene Mayevski 'EldoS Corp 我真的很想找人讨论主动预测攻击。数据库将负责防止碰撞。 - Andrey
@guildsbounty,由于一些位被保留,因此 Version 4 UUID 并不是很多。但是你评论中的其余部分仍然是正确的。 - CodesInChaos
2个回答

8

GUID/UUID的主要用途是生成128位数字作为唯一(在所有意义上)的标识符。

UUID并不是设计用于生成具有强加密随机数序列的,如果您想要最大的不可预测性,则需要使用具有强加密随机数序列。为此,.NET提供了RNGCryptoServiceProvider-从根本上设计为通过算法手段实现尽可能不可预测,那么为什么不使用它呢?

示例:

byte[] GenerateRandomBytes()
{
   byte[] key = new byte[16];

    System.Security.Cryptography.RNGCryptoServiceProvider c =
        new System.Security.Cryptography.RNGCryptoServiceProvider();

    c.GetBytes(key);

    return key;
}

4
据我所知,.net默认生成版本4 UUIDs作为Guids。这些是随机的,如果正确实现,则很难猜测。但由于将来的版本可能使用另一种实现,因此我不会依赖它。我认为甚至早期的Windows或.net版本也使用基于Mac地址的Guids,这些更容易猜测。

因此,我只会使用内置在.net中的加密伪随机数生成器之一。如果您生成16字节,则可以替换Guid。


2
你能定义“难以猜测”的含义吗?足够安全的用于论坛,足够安全的用于银行,足够安全的用于国家安全。 - Andrey
一个随机的128位数字对于任何事情都足够安全(国家安全需要特定的认证过程,因此您的临时实现无法使用)。问题在于数字的质量。这就是为什么我建议不要使用标准GUID生成器,而是使用加密伪随机数生成器。 - CodesInChaos
1
有比随机猜测该大小的有效随机数更有可能的其他攻击。 - CodesInChaos
@CodesInChaos:实际上,“一个随机的128位数字足够安全”应该说是122位,因为在GUID的第4个版本中,也就是.NET当前生成的版本中,有6位是固定的。 - Piotr Owsiak
@CodesInChaos:还有一个原因是由于6位被固定,你不能仅仅生成16字节的随机序列并将其视为Guid的替代品。 - Piotr Owsiak
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接