usr*_*usr 16 security sql-server uniqueidentifier sql-server-2012 cryptography
我打算使用 aUNIQUEIDENTIFIER
作为用户可以用来访问某些数据的访问密钥。从这个意义上说,密钥将充当密码。
我需要生成多个这样的标识符作为INSERT...SELECT
语句的一部分。出于架构原因,我想在这种情况下生成服务器端标识符。
如何生成安全的随机数UNIQUEIDENTIFIER
?请注意,这NEWID
不够随机,因为它根本不承诺任何安全属性。我正在寻找与System.Security.Cryptography.RandomNumberGenerator等效的 SQL Server,因为我需要不可猜测的 ID。任何基于CHECKSUM
, RAND
or 的东西GETUTCDATE
也不符合条件。
Mar*_*ith 26
SELECT CAST(CRYPT_GEN_RANDOM(16) AS UNIQUEIDENTIFIER)
Run Code Online (Sandbox Code Playgroud)
应该做我本来想的把戏。
返回由加密 API (CAPI) 生成的加密随机数。
根据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 以来,
“Windows 中内置的所有版本 4 GUID 的随机位都是通过 Windows CryptGenRandom 加密 API 或等效项获得的,与用于生成加密密钥的源相同”
所以我想说你可以认为 NEWID() 在加密上是安全的——至少在它提供的 122 位熵方面是安全的。