在SQL Server中安全地生成UNIQUEIDENTIFIER


15

我打算将a UNIQUEIDENTIFIER作为访问密钥,用户可以用来访问某些数据。在这种意义上,密钥将充当密码。

我需要在INSERT...SELECT语句中生成多个这样的标识符。出于架构原因,在这种情况下,我想在服务器端生成标识符。

如何生成安全随机的UNIQUEIDENTIFIER?注意,这NEWID不会足够随机,因为它根本不保证任何安全属性。我正在寻找与System.Security.Cryptography.RandomNumberGenerator等效的SQL Server,因为我需要不可猜测的ID。基于的任何内容CHECKSUMRANDGETUTCDATE也不符合条件的内容。


2
至少@AaronBertrand,如果数字始终为,则为@ 4。但是,我没有确凿的证据表明它们可能是可猜测的事实,并不意味着它们不是。我不能基于此观察来做出此安全决策。
usr

1
也许NEWID和“ Debian弱SSH密钥”一样随机:en.wikinews.org/wiki/…对于测试它们的开发人员,它们当然看起来是随机的……
usr

2
那4告诉您在生成GUID中使用了什么算法。en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm
Mr.Mindor

1
您确实了解到,安全级别的唯一决定因素是比特熵吗?NEWID不能足够随机地满足您的需求的想法意味着您对使用情况需要“安全”的位熵量有所了解。那是几号
Cade Roux

2
@usr-“充分了解内部状态”,可以破解任何方法。

Answers:



4

只是我的两美分,但这可能不是一个好主意。为了解释Eric Lippert关于GUID的出色系列(第1部分第2部分第3部分),首字母缩写是GUID,而不是GSUID-全局唯一标识符,不是全局安全唯一标识符。

问题在于,当在非敌对范围内(例如,每个使用NEWID()的人)生成GUID时,所有值都被保证是唯一的(很好,请参阅Eric的文章,第3部分)。但是,如果敌对实体进入该范围,则它们既可以预测下一个生成的GUID,也可以自己引发冲突。

通过创建自己的生成值的方法,该方法将值存储在看起来像GUID的结构中,实际上已成为一个敌对实体。您已将GUID的合同从唯一更改为随机。虽然有一个数学能力比我更好的人可能证明您仍然是独一无二的,但这仅在您的生成方法的范围之内。如果将这些伪GUID与NEWID()GUID混合使用,则所有选择都将关闭。

我说这可能不是一个好主意,因为我不知道您使用这些值的整个范围。如果您是唯一一个生成值的实体(不进行混合和匹配),并且/或者您不保留这些值,并且/或者您不关心冲突,那么这可能不是问题。如果其中任何一项都不正确,则可能需要重新评估。


有趣的一点。我的数据类型选择UNIQUEIDENTIFIER主要是巧合。使用该类型处理16字节数量只是很方便。我认为它是密码。但是,它必须是唯一的。我有信心永远不会发生冲突(即使有该应用程序也会崩溃,所以这也是安全的)。
usr

我不同意,这取决于它如何变成随机而不是唯一的加密方式。它可以很容易地相同。
Dawesi

4

根据https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newsequentialid-histrorybenefits-and-implementation/的说法,NEWID()函数仅包装Windows函数CoCreateGuid,该函数返回v4样式的GUID 。根据https://msdn.microsoft.com/zh-CN/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11的说法,自Windows 2000始于1999年以来,

“通过Windows CryptGenRandom加密API或等效的(用于生成加密密钥的相同来源)获得Windows内置的所有第4版GUID的随机位”

所以我想说,您可以考虑NEWID()加密安全性-至少达到它提供的122位熵的程度。


那很有意思。我个人出于安全目的不愿意相信这一点。Windows和SQL Server都不对此提供保证。
usr

@usr我不确定保证会是什么样子。它没有使用“保证”一词,但它似乎是标准的MSDN Windows SDK文档。在将来的Windows版本中,MS不太可能降低GUID的加密随机性。没有任何收获。
约旦·里格

该MSDN页面仅记录了历史性的选择,但并没有说将来会保留。与SQL Server相同。我无法想象在什么情况下会崩溃。但是,发生了许多灾难性的RNG崩溃。像这样的假设经常被证明是错误的。这是一个启发式的论点。
usr

@usr但是任何MSDN文档如何保证 Windows的未来行为?在这些情况下,我们最大的希望就是记录当前行为。如果行为发生了变化,那么他们会更新文档。这就是为什么这些Stack Overflow Q&A具有版本标记并会不时更新的原因。
约旦·里格

他们确实保证不会改变的事情。他们可以更改产品,但是如果他们说“这是具有这些属性的安全关键功能”,则不会。我认为该文档更像是一种历史观点,而不是对未来的陈述。
usr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.