我打算使用 aUNIQUEIDENTIFIER
作为访问密钥,用户可以使用它来访问某些数据。从这个意义上说,密钥将充当密码。
我需要生成多个这样的标识符作为INSERT...SELECT
语句的一部分。出于架构原因,我想在这种情况下在服务器端生成标识符。
如何生成安全随机UNIQUEIDENTIFIER
?请注意,这NEWID
不够随机,因为它根本不承诺任何安全属性。我正在寻找System.Security.Cryptography.RandomNumberGenerator的 SQL Server 等效项,因为我需要不可猜测的 ID。任何基于CHECKSUM
或的东西RAND
也不GETUTCDATE
符合条件。
应该做我想的伎俩。
CRYPT_GEN_RANDOM
只是我的两分钱,但这可能不是一个好主意。套用 Eric Lippert 关于 GUID 的优秀系列(第 1部分、第 2部分、第 3 部分),首字母缩略词是 GUID,而不是 GSUID - 全球唯一标识符,而不是全球安全唯一标识符。
问题在于,当 GUID 在非敌对范围内生成时,例如每个人都使用 NEWID(),所有值都保证是唯一的(嗯,有点,请参阅 Eric 的文章,第 3 部分)。但是,如果敌对实体进入该范围,它们既可以预测下一个生成的 GUID,也可以自行引发冲突。
通过创建自己的方法来生成存储在看起来像 GUID 的结构中的值,您实际上已成为一个敌对实体。您已将 GUID 的合同从唯一更改为随机。虽然比我更擅长数学的人可能会证明你仍然是独一无二的,但这只是在你的生成方法的范围内。如果您将这些伪 GUID 与 NEWID() GUID 混合使用,则所有赌注都将失败。
我说这可能不是一个好主意,只是因为我不知道您如何使用这些值的整个范围。如果您是唯一生成值的实体(没有混合和匹配),和/或您没有保留这些值,和/或您不关心冲突,这可能不是问题。如果其中任何一项不正确,您可能需要重新评估。
根据https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newsequentialid-histrorybenefits-and-implementation/, NEWID() 函数只是包装了 Windows 函数 CoCreateGuid,它返回一个 v4 样式的 GUID . 根据https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11,自 1999 年的 Windows 2000 以来,
所以我想说你可以考虑 NEWID() 加密安全 - 至少在它提供的 122 位熵的范围内。