NEWSEQUENTIALID有多可预测?

Mar*_*ers 5 sql sql-server guid primary-key newsequentialid

根据微软的文档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.

pod*_*ska 5

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

换句话说:

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

接下来是

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

接下来是

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

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

所以,这是非常可预测的

NewSequentialID是 windows 函数的包装器UuidCreateSequential


Rem*_*anu 5

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

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

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