6

根据微软关于 的文档NEWSEQUENTIALID,NEWSEQUENTIALID 的输出是可以预测的。但是可预测性如何?假设我有一个由 生成的 GUID,NEWSEQUENTIALID它有多难:

  • 计算下一个值?
  • 计算前一个值?
  • 计算第一个值?
  • 计算第一个值,即使根本不知道任何 GUID?
  • 计算行数?例如,当使用整数时,/order?id=842告诉我应用程序中有 842 个订单。

下面是一些关于我在做什么以及各种权衡是什么的背景信息。

使用 GUID 而非整数作为主键的安全优势之一是 GUID 很难猜测。例如,黑客看到一个/user?id=845他可能会尝试访问的 URL /user?id=0,因为数据库中的第一个用户很可能是管理用户。此外,黑客可以迭代/user?id=0..1..2以快速收集所有用户。

同样,整数的隐私缺点是它们会泄露信息。/order?id=482告诉我,该网店自实施以来已收到 482 个订单。

不幸的是,使用 GUID 作为主键具有众所周知的性能缺点。为此,SQL Server 引入了该NEWSEQUENTIALID功能。在这个问题中,我想了解输出的可预测性NEWSEQUENTIALID

4

4 回答 4

4

在大多数情况下,下一个newsequentialid可以通过获取当前值并将一个添加到第一个十六进制对来预测。

换句话说:

1E 29E599-45F1-E311-80CA-00155D008B1C

紧随其后的是

1F 29E599-45F1-E311-80CA-00155D008B1C

紧随其后的是

20 29E599-45F1-E311-80CA-00155D008B1C

有时,序列将从新值重新开始。

所以,这是非常可预测的

NewSequentialID是windows函数的封装UuidCreateSequential

于 2014-06-11T08:50:49.120 回答
3

底层操作系统功能是UuidCreateSequential. 该值源自您的其中一个网卡 MAC 地址和per-os-boot 增量值。请参阅RFC4122。SQL Server 会进行一些字节洗牌以使结果正确排序。因此,从某种意义上说,价值是高度可预测的。具体来说,如果您知道一个值,您可以立即预测一个相似值的范围。

但是,我们无法预测 的等价物id=0,也无法预测这52DE358F-45F1-E311-93EA-00269E58F20D意味着商店至少售出了 482 件商品。

唯一“批准”的随机生成是CRYPT_GEN_RANDOM(包装CryptGenRandom),但这显然是一个可怕的关键候选者。

于 2014-06-11T10:05:58.230 回答
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...,等等...)。我等了一段时间检查它,一段时间后第二部分也增加了。我想这会持续到所有部分。基本上它看起来像简单的+=1incementation 转化为 Guid。

编辑:

如果您想要顺序 GUID 并且想要控制这些值,则可以使用Sequences

示例代码:

select cast(cast(next value for [dbo].[MySequence] as varbinary(max)) as uniqueidentifier)
于 2014-06-11T08:58:06.920 回答
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 攻击有用。来自:使用 NewSequentialID 有什么缺点吗?

于 2014-06-11T08:40:41.717 回答