将GUID压缩为64位以用作登录密钥是否有风险?

时间:2011-11-19 20:18:34

标签: security guid

在要求我搜索SO和found this answer之前,基本上说GUID是可预测的,因此永远不应该用于随机的任何事情。但从我的理解,我不同意。然而,这个问题是关于压缩GUID

根据我的理解,GUID由部分MAC地址,时间和随机数组成。我不知道GUID的哪个部分是什么,但是这个函数基本上将它用作2个64位的整数并将它们一起异或。我目前使用结果1)为想要重置密码的人重置密钥。 2)登录密钥。登录时,它会在db和cookie中设置密钥。每次访问该站点时,它都会检查cookie是否与数据库中的userid和loginkey匹配。

这样安全吗?对我而言,感觉随意。这些字节不用于加密东西,即使你知道一个人登录到100毫秒时我怀疑它可以猜到它(记住检查是通过网络连接,而不是直接检查数据库,你在哪种情况下/可以看到价值)

这次使用有问题吗?

public static Int64 GuidInt64(bool noZero=true)
{
    Int64 randNum;
    do
    {
        var g = Guid.NewGuid();
        var buf = g.ToByteArray();
        var l0 = BitConverter.ToInt64(buf, 0);
        var l1 = BitConverter.ToInt64(buf, 8);
        randNum = l0 ^ l1;
    } while (noZero && randNum == 0);
    return randNum;
}

2 个答案:

答案 0 :(得分:3)

“足够安全”是相对的,并且根据您保护的数据的敏感程度和攻击的可能性而有所不同。

在银行系统上我有疑虑,但是在像StackOverflow这样的网站上,没有太多敏感数据,也没有太多可以通过被盗身份完成(除了垃圾信誉)我会说它足够安全。

这一切都归结为风险和合理缓解风险。

也就是说,有了这么多优秀的现有加密算法,使用单向散列来存储用户名和密码或其他类似的安全密钥仍然更好。

答案 1 :(得分:1)

你为什么要使用GUID?

using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider())
{
    byte[] inBytes = new byte[4];
    rng.GetBytes(inBytes);
    return BitConverter.ToInt64(inBytes,0);
}

您可能还希望在接受生成的值之前检查冲突。