Mar*_*ers 5 sql sql-server guid primary-key newsequentialid
根据微软的文档NEWSEQUENTIALID,NEWSEQUENTIALID的输出是可预测的.但可预测的可预测性如何?假设我有一个生成的GUID,NEWSEQUENTIALID它有多难:
/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.
在大多数情况下,newsequentialid可以通过获取当前值并向第一个十六进制对加一来预测下一个。
换句话说:
1E 29E599-45F1-E311-80CA-00155D008B1C
接下来是
1F 29E599-45F1-E311-80CA-00155D008B1C
接下来是
20 29E599-45F1-E311-80CA-00155D008B1C
有时,序列会从新值重新开始。
所以,这是非常可预测的
NewSequentialID是 windows 函数的包装器UuidCreateSequential
底层操作系统功能是UuidCreateSequential. 该值源自您的网卡之一的 MAC 地址和每个操作系统启动的增量值。请参阅RFC4122。SQL Server 会进行一些字节混排以使结果正确排序。因此,从某种意义上说,该价值是高度可预测的。具体来说,如果您知道一个值,您可以立即预测相似值的范围。
然而,我们无法预测 的等价物id=0,也无法预测这52DE358F-45F1-E311-93EA-00269E58F20D意味着商店至少售出 482 件商品。
唯一“批准”的随机生成是CRYPT_GEN_RANDOM(包装CryptGenRandom),但这显然是一个可怕的关键候选者。
| 归档时间: |
|
| 查看次数: |
1118 次 |
| 最近记录: |