问题 guids可以信任安全性,还是可以预测系统是否可以强制生成许多已知的guid?


要开始并定义guid,我使用的是.net框架Guid 这在某种程度上是假设的情况 用户在执行特定操作时会生成guid。每个用户都可以看到自己的guid。如果用户要知道另一个用户的guid之一,则会出现安全性损害。

如果我们认为用户无法窃取另一个用户的guid并且只能猜测它,那么这个系统有多安全?

我明白盲目猜测guid是不可能的。即使他们有一百万的成功价值,他们仍然只有10 ^ 20的成功猜测机会

我害怕可能存在的问题是指导预测。用户是否可以生成大量请求,查看他获得的guid,并且知道.net guid生成公式可以大大提高他猜测的几率? 这些几率可以降低到安全问题吗? 在这种情况下,如何以一种独特的不可猜测的方式生成密钥?

我问任何提到猜测/碰撞几率的人都会给它添加一些难以理解的含义。要么是用于定义赔率的确切数字,要么是“它可以用于存储帐户数据,而不是用于存储敏感数据”

编辑

这个问题似乎进入了我最初试图用这个问题探索的领域 GUID是(临时)加密的好钥匙吗?


5558
2018-01-25 21:34


起源

Guid不是唯一的;因此理论上两个用户可以拥有相同的Guid。 - Aaron McIver
可能类似于 stackoverflow.com/questions/4517497/... - Eugene Mayevski 'Allied Bits
对于正确生成的随机指导,碰撞的可能性足够低以保证实践中的唯一性。 - CodesInChaos
@Aaron,guids在技术上并不独特,但它们在统计上是独一无二的。有3.4×10 ^ 38个可能的指导......可观测宇宙中的每颗恒星在统计上都可以拥有6.8×10 ^ 15。任何两个人拥有相同指导的几率几乎是不可能的 - guildsbounty
@Eugene Mayevski'EldoS Corp我真的很想找人讨论主动预测攻击。 db将负责不允许冲突 - Andrey


答案:


GUID的/ UUID旨在生成128位数,主要用作唯一的ID(用于所有意图和目的)。

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;
}

7
2018-01-26 03:04





Afaik .net生成 版本4 UUID 默认为Guids。如果正确实施,这些是随机的,很难猜测。但由于未来版本可能会使用其他实现,因此我不会依赖它。我认为即使早期版本的Windows或.net也使用基于Mac-Address的Guids,这些更容易猜到。

所以我只使用内置于.net中的一个crypto-pseudo-random-number-generator。如果您生成16个字节,则可以直接替换Guid。


4
2018-01-25 21:37



你能定义“难以猜测”吗?足够安全的论坛,足够安全的银行,足够安全的国家安全 - Andrey
随机128位数对任何事物都足够安全(国家安全需要某些认证过程,因此无法使用您的临时实施)。数字的质量是问题。这就是为什么我建议不使用标准的GUID生成器,而是使用加密prng。 - CodesInChaos
还有其他攻击比随机猜测该大小的有效随机数更有可能。 - CodesInChaos
如果您唯一担心的是某人通过强制系统生成一堆GUID并分析它们来获取GUID,那么我认为如果您使用 RNGCryptoServiceProvider。我认为攻击者可能会改为使用传输方法(HTTP,SMTP等)。如果您认为某人可能会尝试执行此类攻击,我建议您使用速率限制器来“验证”GUID。 - Chris Haas
对于如此长的随机数,带宽是足够的限制。但网址可能很容易泄漏。浏览器或代理可能会保留历史记录,它是您从该页面关注的链接引用者的一部分,... - CodesInChaos