根据Microsoft's documentation on NEWSEQUENTIALID
,NEWSEQUENTIALID的输出是可预测的。但可预测的可预测性如何?假设我有一个由NEWSEQUENTIALID
生成的GUID,它有多难:
/order?id=842
告诉我应用程序中有842个订单。以下是有关我正在做什么以及各种权衡取舍的背景信息。
使用GUID的整数作为主键的安全性的好处之一是GUID难以猜测。例如。假设黑客看到像/user?id=845
这样的网址,他可能会尝试访问/user?id=0
,因为数据库中的第一个用户很可能是管理用户。此外,黑客可以迭代/user?id=0..1..2
以快速收集所有用户。
同样,整数的隐私缺点是它们泄露了信息。 /order?id=482
告诉我,网店自实施以来已有482个订单。
不幸的是,使用GUID作为主键具有众所周知的性能缺点。为此,SQL Server引入了NEWSEQUENTIALID
函数。在这个问题中,我想了解NEWSEQUENTIALID
的输出是如何可预测的。
答案 0 :(得分:4)
在大多数情况下,可以通过获取当前值并向第一个十六进制对添加一个来预测下一个newsequentialid
。
换句话说:
<强> 1E 强> 29E599-45F1-E311-80CA-00155D008B1C
之后是
<强> 1F 强> 29E599-45F1-E311-80CA-00155D008B1C
之后是
<强> 20 强> 29E599-45F1-E311-80CA-00155D008B1C
有时,序列将从新值重新启动。
所以,这是非常可预测的
NewSequentialID
是Windows函数UuidCreateSequential
答案 1 :(得分:3)
底层操作系统功能是UuidCreateSequential
。该值来自您的某个网卡MAC地址和per-os-boot incremental value。见RFC4122。 SQL Server执行了一些byte-shuffling来正确排序结果。因此,从某种意义上说,价值是高度可预测的。具体来说,如果您知道某个值,则可以立即预测一系列相似值。
然而,人们无法预测id=0
的等价物,也无法预测52DE358F-45F1-E311-93EA-00269E58F20D
意味着商店至少售出482件商品。
唯一“已批准”的随机生成是CRYPT_GEN_RANDOM
(包裹CryptGenRandom
),但这显然是一个可怕的关键候选者。
答案 2 :(得分:2)
您可以尝试以下代码:
DECLARE @tbl TABLE (
PK uniqueidentifier DEFAULT NEWSEQUENTIALID(),
Num int
)
INSERT INTO @tbl(Num) values(1),(2),(3),(4),(5)
select * from @tbl
在这段时间我的机器上的结果是:
PK Num
52DE358F-45F1-E311-93EA-00269E58F20D 1
53DE358F-45F1-E311-93EA-00269E58F20D 2
54DE358F-45F1-E311-93EA-00269E58F20D 3
55DE358F-45F1-E311-93EA-00269E58F20D 4
56DE358F-45F1-E311-93EA-00269E58F20D 5
您应该在不同的时间/日期尝试多次以插入行为。
我尝试了几次运行,第一部分每次都在变化(你看到结果:52 ......,53 ......,54 ......等等)。我等了一段时间检查它,一段时间后第二部分也增加了。我认为继续进行所有部分。基本上它看似简单的+=1
incementation转换为Guid。
修改强>
如果您想要顺序GUID并且想要控制值,可以使用Sequences。
示例代码:
select cast(cast(next value for [dbo].[MySequence] as varbinary(max)) as uniqueidentifier)
答案 3 :(得分:1)
•计算下一个值?是
微软说:
如果担心隐私,请不要使用此功能。可以猜测下一个生成的GUID的值,因此可以访问与该GUID相关联的访问数据。
因此有可能获得下一个价值。如果有可能获得prevoius,我找不到信息。
来自:http://msdn.microsoft.com/en-us/library/ms189786.aspx
编辑:关于NEWSEQUENTIALID和安全性的另外几个词:http://vadivel.blogspot.com/2007/09/newid-vs-newsequentialid.html
修改强> NewSequentialID包含服务器的MAC地址(或其中之一),因此知道顺序ID会提供潜在的攻击者信息,这些信息可能是安全或DoS攻击的一部分。 来自:Are there any downsides to using NewSequentialID?