代码之家  ›  专栏  ›  技术社区  ›  teedyay

guid有多安全?

  •  50
  • teedyay  · 技术社区  · 14 年前

    不久前,我开发了一个web应用程序,用户可以在其中购买门票。由于我们客户流程的工作方式,您购买的结果实际上是一个带有票证号码的URL。

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

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

    Random 又快又不安全 RNGCryptoServiceProvider 是缓慢而安全的。也就是说,有人可以投入足够的精力来预测结果是合理的 ,但不是 RNGCryptoServiceProvider服务提供商 .

    如果您看到一个足够长的guid序列,是否有可能预测未来的guid?如果是的话,你需要看多少?

    如果有人猜到了其他人的GUID,那就糟糕了,所以我们当时没有担心。将GUID用作数据库键的便利性使其成为一种有用的数据类型。]


    编辑:

    使用 0xA3 的答案,以及以下链接 question Section 4.4 of RFC 4122 :

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

    Guid.NewGuid()

    当然,任何加密随机文本都可以作为票号,但是guid非常方便。:-)

    与其他版本4的guid一样,没有绝对的唯一性保证,但是这种可能性令人印象深刻。只要你有少于326915130069135865(即。 sqrt(-2*2^122*ln(0.99)) )同时使用guid,可以99%以上确定没有冲突。换句话说:如果像我一样,你的应用程序会有溢出错误,如果你有超过 int.MaxValue 几乎任何事情,你都可以超过99.999999999999999%的确定没有碰撞(即。 e^-(((2^31-1)^2)/(2*2^122)) one per 100 million years ).

    3 回复  |  直到 7 年前
        1
  •  35
  •   Community Paul Sweatte    7 年前

    uuid/guid由 RFC4122 . 尽管版本4 UUID是从随机数创建的 Section 6 对安全性做出明确声明:

    不要认为uuid很难猜测 ;不应使用 作为安全能力(仅拥有 访问),例如。一个可预测的随机数源 使局势恶化。

    How Random is System.Guid.NewGuid()? (Take two)

        2
  •  14
  •   Rusty    14 年前

    这是一个完美的例子,说明如何不考虑安全问题。不幸的是,这是大多数开发人员对安全性的看法。。。

    …潜在价值 ?...

    每张票300万美元 . 这种钱可以吸引有很多资源的人…一些非常严肃的人。使用任何依赖于通用随机数生成器的东西都不是非常随机的…因此不太安全。它比密码学更模糊。

    …身体安全检查…不得不 出示护照。。。

    再说一次,有那么多的切达干酪。。。你想要什么护照我都可以给你。

    …有可能预测未来

    对。问题是…需要多长时间? …每个处理工作的单位。

    …如果是,你需要多少 看到了吗?。。。

    --这可能看起来有点过于戏剧化,但你说的是 严重的 安全咨询公司 它可以帮助您选择所需的加密包 购买 为了这个。你的客户应该能够通过他们的风险管理部门或他们的保险公司提供帮助…如果不是,找你自己的律师。。。 你应该已经有了 .

    拿着袋子 如果出了问题。那对你来说真的很糟糕。

    从客户那里获得一张“免出狱”卡总是个好主意。如果你告诉他们“我们可以让它安全的情况下,琐碎的攻击…但我们不是一个安全或加密公司。”然后你的工作完成了,客户就离开了 .

        3
  •  8
  •   JaredPar    14 年前

    GUID 是由一个众所周知的 algorithm . 没有内置的随机性,因为众所周知的值(如网卡ID和时间戳)用于生成它们。

    从未 用作安全手段。

    编辑

    它似乎是新版本的 GUID/UUID

        4
  •  0
  •   magallanes    4 年前

    从功能上讲

    人们说GUID/UUID不安全。是真的吗?

    C#的GUID是一个128位整数,它意味着很多组合:170141183460469231731687303715884105727

    但是假设我们的攻击者使用暴力,每次尝试需要0.1秒,你知道我们在说很多时间,所以没有人敢这么做。

    但是假设GUID不是“安全的”,所以熵减少到32位(2147483647),这意味着暴力攻击可以持续

    2147483647 x 0.1秒/60/60/24=2400天。因此,即使是32位GUID也是安全的(但它可能会产生冲突)。

    我们可以说,一个GPU或一台超级计算机可以在几秒钟内生成这么多的组合。 是的,但是如果不能测试,那么生成一个值列表就毫无意义了。

    在数学上,GUID是安全的,但是数学世界和现实世界太不一样了。