Sql server NewID()-是否很有可能公开上一个/下一个GUI

Sql server NewID()-是否很有可能公开上一个/下一个GUI,sql-server,guid,newid,Sql Server,Guid,Newid,我知道guid在理论上是独一无二的,碰撞的可能性很低。然而,如果我理解正确,一些唯一性是可用的,因为它是根据计算机上的信息播种的,根据使用的算法生成 给定GUID,用户猜测表中其他GUID的可能性有多大 例如,如果您的新闻稿订户具有取消订阅功能,您可以将其发布到example.com/subscriber/unsubscribe/{id} 对于整数标识,这显然是个坏主意。ID为1000的用户可以通过猜测ID在几秒钟内取消订阅整个数据库 如果ID列是一个初始化为newid()的GUID,那么如果您

我知道guid在理论上是独一无二的,碰撞的可能性很低。然而,如果我理解正确,一些唯一性是可用的,因为它是根据计算机上的信息播种的,根据使用的算法生成

给定GUID,用户猜测表中其他GUID的可能性有多大

例如,如果您的新闻稿订户具有取消订阅功能,您可以将其发布到example.com/subscriber/unsubscribe/{id}

对于整数标识,这显然是个坏主意。ID为1000的用户可以通过猜测ID在几秒钟内取消订阅整个数据库


如果ID列是一个初始化为newid()的GUID,那么如果您的用户知道正确的ID,他们猜测正确ID的可能性有多大?

我想说,理论上可能是这样,但实际上不太可能发生

我已经阅读了Eric Lippert的博客帖子,这些帖子与他的评论中的链接不谋而合,还有一些关于堆栈溢出的其他答案:

据我所知:给定一组几个guid,可能会发现它们是否是在同一台机器上生成的。但这并不容易找到,对普通用户来说肯定不容易

现在我想,如果只给出一个GUID(示例中的时事通讯订阅ID),那么很难猜测其他GUID。
如果(并且只有当)这真的是可能的,您可能需要一台快速的机器和关于用于创建guid的算法的深入知识

最后,您必须查看上下文:
即使可以猜测GUID(我不确定是否是-我确定我不能这么做),我也无法想象有人会真的这样做,以便从您的新闻稿中取消订阅其他人。

NEWID()生成一个版本4 GUID,但它的实现是可猜测的

根据RFC 4122规范:

安全注意事项

不要认为UUID很难猜测;它们不应该被使用 作为安全功能(仅拥有权限即可授予的标识符
访问),例如。可预测的随机数源将
使局势恶化

正如@martin smith指出的,仅仅因为它是版本4,并不意味着它本质上是可以猜测的,它取决于实现。演示如何使用不可猜测的SQL创建投诉版本4 GUID:

SELECT CAST(CRYPT_GEN_RANDOM(16) AS UNIQUEIDENTIFIER)
参考文献:


您的担忧是非常正确的。请参阅“不要假设它们在所有实现中都不可猜测”和“生成版本4 GUID的所有实现都可猜测”之间的区别。好的一点是,NEWID()是可猜测的,不应在IMO中使用。但您可以创建不可猜测的版本4 GUID。我把答案改得更清楚了。