根据微软的文档NEWSEQUENTIALID http://msdn.microsoft.com/en-us/library/ms189786.aspx,NEWSEQUENTIALID 的输出是可预测的。但可预测性如何呢?假设我有一个 GUID,是由NEWSEQUENTIALID
,这有多难:
- 计算下一个值?
- 计算之前的值?
- 计算第一个值?
- 即使根本不知道任何 GUID,也要计算第一个值?
- 计算行数?例如。当使用整数时,
/order?id=842
告诉我应用程序中有 842 个订单。
以下是有关我正在做的事情以及各种权衡的一些背景信息。
中的一个security使用 GUID 相对于整数作为主键的好处是 GUID 很难猜测。例如。假设黑客看到如下 URL/user?id=845
他可能会尝试访问/user?id=0
,因为数据库中的第一个用户很可能是管理用户。此外,黑客可以迭代/user?id=0..1..2
快速聚集所有用户。
同样,一个privacy整数的缺点是它们会泄漏信息。/order?id=482
告诉我,该网店自上线以来已有 482 个订单。
不幸的是,使用 GUID 作为主键已众所周知表现缺点。为此,SQL Server 引入了NEWSEQUENTIALID
功能。在这个问题中,我想了解如何预测输出NEWSEQUENTIALID
is.
底层操作系统功能是UuidCreateSequential http://msdn.microsoft.com/en-us/library/windows/desktop/aa379322%28v=vs.85%29.aspx。该值源自您的网卡之一的 MAC 地址和每个操作系统启动增量值 http://ayende.com/blog/4628/implementing-createsequentialuuid. See RFC4122 http://www.ietf.org/rfc/rfc4122.txt。 SQL Server 做了一些字节改组 http://blogs.msdn.com/b/dbrowne/archive/2012/07/03/how-to-generate-sequential-guids-for-sql-server-in-net.aspx使结果正确排序。因此,从某种意义上说,该价值是高度可预测的。具体来说,如果您知道一个值,您可以立即预测相似值的范围。
然而,人们无法预测相当于id=0
,也不能预测52DE358F-45F1-E311-93EA-00269E58F20D
表示商店至少售出 482 件商品。
唯一“批准”的随机生成是CRYPT_GEN_RANDOM http://msdn.microsoft.com/en-us/library/cc627408.aspx(它包裹着CryptGenRandom http://msdn.microsoft.com/en-us/library/windows/desktop/aa379942%28v=vs.85%29.aspx)但这显然是一个可怕的关键候选人。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)