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

时间:2011-01-25 21:34:37

标签: .net security guid

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

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

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

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

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

修改

这个问题似乎进入了我最初试图用这个问题探索的领域 Is a GUID a good key for (temporary) encryption?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

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

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