NEWSEQUENTIALID有多可预测?

时间:2014-06-11 08:29:39

标签: sql sql-server primary-key guid newsequentialid

根据Microsoft's documentation on NEWSEQUENTIALID,NEWSEQUENTIALID的输出是可预测的。但可预测的可预测性如何?假设我有一个由NEWSEQUENTIALID生成的GUID,它有多难:

  • 计算下一个值?
  • 计算以前的值?
  • 计算第一个值?
  • 计算第一个值,即使根本不知道任何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的输出是如何可预测的。

4 个答案:

答案 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?