【问题标题】:Can guids be trusted for security, or are they predictable if the system can be forced to generate many known guids?是否可以信任 guid 的安全性,或者如果系统可以强制生成许多已知的 guid,它们是否可以预测?
【发布时间】:2013-05-30 02:35:47
【问题描述】:

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

如果我们假设一个用户无法窃取另一个用户的 guid 并且只能猜测,那么这个系统的安全性如何?

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

我担心可能存在问题的地方是 guid 预测。用户能否生成大量请求,看看他得到的 guid,知道 .net guid 生成公式会大大提高他的猜测几率吗? 能否将这些可能性降低到成为安全问题的程度? 在那种情况下,如何以独特的不可猜测的方式生成密钥?

我请任何提到猜测/碰撞几率的人为其添加一些硬性含义。定义赔率的确切数字,或类似“它可用于存储帐户数据,但不能用于存储敏感数据”

编辑

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

【问题讨论】:

  • Guid 不是唯一的;因此理论上两个用户可以拥有相同的 Guid。
  • 对于正确生成的随机 guid,冲突的可能性非常低,可以保证实践中的唯一性。
  • @Aaron,guid 在技术上并不是唯一的,但它们在统计上是唯一的。有 3.4×10^38 可能的 guid……可观测宇宙中的每颗恒星在统计上都可以拥有 6.8×10^15。任何两个人拥有相同 guid 的可能性都非常不可能
  • @Eugene Mayevski 'EldoS Corp 我真的在找人来讨论主动预测攻击。数据库将负责不允许冲突

标签: .net security guid


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Afaik .net 默认生成 Version 4 UUIDs 作为 Guid。这些是随机的,如果实施得当,很难猜测。但由于未来的版本可能会使用另一种实现,我不会依赖它。我认为甚至更早版本的 windows 或 .net 都使用基于 Mac-Address 的 Guid,这更容易猜到。

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

    【讨论】:

    • 你能定义“难以猜测”吗?对论坛足够安全,对银行足够安全,对国家安全足够安全
    • 随机的 128 位数字对于任何事情都足够安全(国家安全需要某些认证过程,因此您的临时实施不能使用)。数字的质量是个问题。这就是为什么我建议不要使用标准的 GUID 生成器,而是使用 crypto-prng。
    • 与随机猜测该大小的有效随机数相比,其他攻击更有可能发生。
    • 如果您唯一担心的是有人通过强制系统生成一堆 GUID 并分析它们的模式来导出 GUID,那么我认为如果您使用 RNGCryptoServiceProvider 生成它们是安全的。我认为攻击者可能会改用您的传输方法(HTTP、SMTP 等)。如果您认为有人可能会尝试执行此类攻击,我建议对任何“验证”GUID 的内容使用速率限制器。
    • 对于这么长的随机数带宽是一个足够的限制。但是 url 很容易泄漏。浏览器或代理可能会保留历史记录,它是您从该页面访问的链接的引用者的一部分,...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多