不久之前,我在一个用户可以购买门票的网络应用程序上工作.由于我们客户的流程的运作方式,您购买后实际获得的是一个带有票号的URL.
这些是在中东购买房产的门票,每张门票的价值可能在300万美元左右.显然抛出顺序整数本来是个坏主意.我们使用GUID,因为它们基本上是不可知的,但我的问题是:它们足够安全吗?
据我所知,GUIDs .NET产生的是完全伪随机的(除了一些非变量位).但是,我不知道使用什么算法来生成它们.
MSDN文档告诉我们Random
快速且不安全,并且RNGCryptoServiceProvider
速度慢且安全.也就是说,假设有人可以投入足够的努力来预测结果Random
,但不是RNGCryptoServiceProvider
.
如果您看到足够长的GUID序列,是否可以预测期货?如果是这样,你需要看多少?
[在我们的特殊情况下,之后会进行身体安全检查 - 您必须出示用于购买机票的护照 - 所以如果有人猜到别人的GUID 就不会太糟糕,所以我们没有出汗当时.使用GUID作为数据库密钥的便利性使其成为一种有用的数据类型.]
编辑:
所以答案是"不够".
使用下面的0xA3的答案,并跟随他链接的问题的链接,以下代码将生成一个加密随机GUID,该GUID由RFC 4122的第4.4节有效:
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);
}
Run Code Online (Sandbox Code Playgroud)
这比GUID产生的速度慢得多 …
我已经向客户发送了10000封邮件,每封邮件都有格式链接
http://example.com/LogIn?key={guid}
Run Code Online (Sandbox Code Playgroud)
不幸的是,guid
我发送的是随机guid(生成的测试数据Guid.NewGuid()
),所以客户都收到了无效链接......
基于我从网络服务器收到的404s,我发了一些guid.我已经读过Windows中的guid生成器很弱,所以你可以预测你已经拥有的下一个guid.有谁知道怎么样?如果我能做到这一点,我可以使我发出的指令有效,这样链接就可以了.
我正在使用以下代码生成反CSRF令牌:
TokenCSRF = new Random(Guid.NewGuid().GetHashCode()).Next(1, 9999).ToString();
Run Code Online (Sandbox Code Playgroud)
这个令牌是可猜测的还是真正随机的?
编辑:我用这个替换了令牌生成器:
byte[] byt = new byte[sizeof(Int32)];
RNGCryptoServiceProvider rngCrypto = new RNGCryptoServiceProvider();
rngCrypto.GetBytes(byt);
return BitConverter.ToInt32(byt, 0);
Run Code Online (Sandbox Code Playgroud)