Security 将GUID压缩为64位用作登录密钥是否存在风险?

Security 将GUID压缩为64位用作登录密钥是否存在风险?,security,guid,Security,Guid,在询问之前,我搜索了SO,它本质上说GUID是可预测的,因此不应该用于任何随机的东西。但据我的理解,我不同意。然而,这个问题是关于挤压GUID的 据我所知,GUID由部分MAC地址、时间和随机数组成。我不知道GUID的哪一部分是什么,但这个函数基本上使用它作为2个64位整数,并将它们异或在一起。我目前使用的结果是1)为想要重置密码的人提供重置密钥。2) 登录密钥。当您登录时,它会在数据库和cookie中设置密钥。每次访问该站点时,它都会检查cookie是否与数据库的userid和loginkey

在询问之前,我搜索了SO,它本质上说GUID是可预测的,因此不应该用于任何随机的东西。但据我的理解,我不同意。然而,这个问题是关于挤压GUID的

据我所知,GUID由部分MAC地址、时间和随机数组成。我不知道GUID的哪一部分是什么,但这个函数基本上使用它作为2个64位整数,并将它们异或在一起。我目前使用的结果是1)为想要重置密码的人提供重置密钥。2) 登录密钥。当您登录时,它会在数据库和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;
}
“足够安全”是相对的,根据您所保护的数据的敏感程度以及攻击的可能性而有所不同

对于一个银行系统,我会有所怀疑,但在像StackOverflow这样的网站上,没有太多的敏感数据,也没有太多可以用被盗身份(除了名誉)来做的事情,我认为它足够安全

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

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

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

对于一个银行系统,我会有所怀疑,但在像StackOverflow这样的网站上,没有太多的敏感数据,也没有太多可以用被盗身份(除了名誉)来做的事情,我认为它足够安全

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


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

为什么要使用GUID

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

在接受生成的值之前,您可能还需要检查冲突。

为什么要使用GUID

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

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

我使用GUID是因为我听说它对于多线程系统是安全的,而system.random则不是。所以我锁定了系统。我记得听说两个CPU内核上的两个随机数生成器可能有相同的种子,因此有相同的随机数。你的解决方案有问题吗?也许我应该有一个静态函数和一个System.Security.Cryptography.RNGCryptoServiceProvider并锁定对它的访问?根据MSDN文档,RNGCryptoServiceProvider是线程安全的。酷,这是我将使用的,但我不知道我是否应该接受这个特定问题的答案。我使用GUID,因为我听说它对于多线程系统是安全的,system.random不是。所以我锁定了系统。我记得听说两个CPU内核上的两个随机数生成器可能有相同的种子,因此有相同的随机数。你的解决方案有问题吗?也许我应该有一个静态函数和一个System.Security.Cryptography.RNGCryptoServiceProvider并锁定对它的访问?根据MSDN文档,RNGCryptoServiceProvider是线程安全的。酷,这就是我将使用的,但我不知道我是否应该接受这个特定问题的答案