前段时间我在一个用户可以购买门票的网络应用程序上工作。由于我们的客户流程的工作方式,您购买后实际获得的是一个带有票号的URL。
这些是在中东购买房产的门票,每张票的价值可能在300万美元左右。显然抛出顺序整数本来是个坏主意。我们使用的是GUID,因为它们基本上是不可取的,但我的问题是:它们足够安全吗?
据我所知,GUIDs .NET产生的是完全伪随机的(除了一些非变量位)。但是,我不知道用什么算法来生成它们。
MSDN文档告诉我们Random
快速且不安全,RNGCryptoServiceProvider
速度慢而且安全。也就是说,假设某人可以投入足够的努力来预测Random
的结果,而不是RNGCryptoServiceProvider
的结果,这是合理的。
如果您看到足够长的GUID序列,是否可以预测期货?如果是这样,你需要看多少?
[在我们的特殊情况下,之后会进行身体安全检查 - 您必须出示您用来购买机票的护照 - 所以如果有人猜到某人,那么它就不会太坏别的GUID,所以我们当时没有出汗。使用GUID作为数据库密钥的便利性使其成为一种有用的数据类型。]
修改
所以答案是“不够”。
使用下面的0xA3回答,并跟踪他链接到的question的链接,以下代码将生成Section 4.4 of RFC 4122有效的加密随机GUID:
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比Guid.NewGuid()
慢得多,但是使用122位“非常随机”的数据,它们是安全无法预测的。
当然,任何加密随机文本都可以用于票号,但GUID非常方便。 : - )
与其他版本4 GUID一样,没有绝对的唯一性保证,但可能性令人印象深刻。只要您同时使用少于326,915,130,069,135,865(即sqrt(-2*2^122*ln(0.99)))GUID,您就可以确保没有碰撞超过99%。换句话说:如果像我一样,如果你的任何东西都超过int.MaxValue
,你的应用程序将会出现溢出错误,你可以确保没有碰撞超过99.9999999999999999(即e^-(((2^31-1)^2)/(2*2^122)) )。这比一个陨石在应用程序上线一秒钟内不会消灭地球上大部分生命(即one per 100 million years)的确定程度大约一千倍。
答案 0 :(得分:31)
UUID / GUID由 RFC4122 指定。虽然版本4 UUID是从随机数创建的Section 6,但它在安全性方面做了明确说明:
不要以为UUID难以猜测;不应该使用它们 作为安全功能(仅仅拥有授权的标识符) 访问),例如。可预测的随机数源将 加剧了局势。
在这个问题中也可以找到关于GUID随机性的很好的讨论:
答案 1 :(得分:13)
这是如何不考虑安全问题的完美示例。不幸的是,这是大多数开发人员对安全性的看法......
......潜在的价值 300万美元......他们足够安全吗? ?...
没有。对于可能支付每张票3M美元的问题,可以投入大量资源。这种钱可以吸引拥有大量资源的人......一些非常认真的人。使用依赖于通用随机数生成器的任何东西都不是非常随机的......因此不是很安全。它比密码学更加模糊。
......物理安全检查......不得不 出示使用的护照......
再一次,在线上有切达干酪......我可以给你任何你想要的护照。
......可以预测未来 的?...
是。问题是......需要多长时间? ...每个处理工作单元。
......如果是这样,你需要多少 看?...
这取决于我对他们创作的了解......操作系统,CPU等等......我相信我能找到你公司的某个人,有兴趣提供一些信息以换取说... $ 100,000或更可能更少。
- 这可能看起来有点过于戏剧性了,但你说的是严重的金额,它应该受到严重保护。您需要一个安全咨询公司,它可以帮助您选择购买的加密包。您的客户应该能够通过他们的风险管理部门或他们的保险公司提供帮助......如果没有,请找到您自己的律师...... 您应该拥有的。
当然,GUID计划出现问题的可能性很小,但如果确实出现了梨形状......你怎么告诉所有这些律师你的安全计划是一流的,他们应该看看在其他地方?...相信我,如果出现问题,你不想拿着行李。那真的很难你。
编辑:关于teedyay的评论......
从客户那里获得“走出监狱免费”卡总是一个好主意。如果你告诉他们“我们可以在琐碎的攻击中使其安全......但我们不是安全或加密公司。”然后你的工作完成了,客户端拿着行李。
答案 2 :(得分:8)
GUID
由众所周知的algorithm生成。内置无随机性,因为众所周知的值(如网卡ID和时间戳)用于生成它们。
他们应该从不用作安全手段。
编辑
GUID/UUID
算法的较新版本不再使用硬件地址作为其部分值,而是使用伪随机数。但这些并非真正随机,仍不应用于安全关键应用程序。
答案 3 :(得分:0)
人们说GUID / UUID不安全。是真的吗?
C#的GUID是128位整数,表示很多组合:170,141,183,460,469,231,731,687,303,715,884,105,727
但是,假设我们的攻击者使用强力暴力,每次尝试都需要0.1秒,您知道我们正在谈论很多时间,所以没人敢这样做。
但是,假设GUID不是“安全的”,那么熵就减少到了32位(2,147,483,647),这意味着蛮力攻击可能会持续
2,147,483,647 x 0.1秒/ 60/60/24 = 2400天。因此,即使是32位GUID也是安全的(但它可能会产生冲突)。
我们可以争辩说GPU或超级计算机可以在几秒钟内生成如此数量的组合。 是的,但是如果无法测试它们,则生成值列表将毫无意义。
此外,蛮力攻击很容易识别,这就是我们所说的DDOS,并且有几种缓解它的方法。
从数学上来说,GUID是安全的,但是数学世界和现实世界太不一样了。