Tengo la intención de usar a UNIQUEIDENTIFIER
como una clave de acceso que los usuarios pueden usar para acceder a ciertos datos. La clave actuará como contraseña en ese sentido.
Necesito generar múltiples identificadores como parte de una INSERT...SELECT
declaración. Por razones arquitectónicas, quiero generar los identificadores del lado del servidor en este caso.
¿Cómo puedo generar un aleatorio seguro UNIQUEIDENTIFIER
? Tenga en cuenta que eso NEWID
no sería lo suficientemente aleatorio, ya que no promete ninguna propiedad de seguridad. Estoy buscando el equivalente de SQL Server de System.Security.Cryptography.RandomNumberGenerator porque necesito identificaciones indiscutibles. Cualquier cosa basada en CHECKSUM
, RAND
o GETUTCDATE
tampoco calificaría.
4
. Pero el hecho de que no tenga pruebas sólidas de que puedan ser adivinables no significa que no lo sean. No puedo basar esta decisión de seguridad en esta observación.Respuestas:
Debería hacer el truco que hubiera pensado.
CRYPT_GEN_RANDOM
fuente
Solo mis dos centavos, pero esto puede no ser una buena idea. Parafraseando la excelente serie de Eric Lippert sobre GUID ( parte 1 , parte 2 , parte 3 ), el acrónimo es GUID, no GSUID: identificador único global, no identificador único globalmente seguro.
El problema radica en que cuando los GUID se generan dentro de un ámbito no hostil, como todos los que usan NEWID (), se garantiza que todos los valores sean únicos (bueno, más o menos, consulte el artículo de Eric, parte 3). Pero si una entidad hostil entra en ese ámbito, pueden predecir el siguiente GUID generado, así como causar colisiones por su cuenta.
Al crear su propio método para generar un valor que almacena dentro de una estructura que parece un GUID, se ha convertido esencialmente en una entidad hostil. Ha cambiado el contrato de un GUID de ser único a ser aleatorio . Si bien alguien mejor en matemáticas de lo que probablemente podría demostrar que todavía eres único, eso solo está dentro de los límites de tu método de generación. Si combina estos pseudo-GUID con NEWID () GUID, todas las apuestas están desactivadas.
Digo que esto puede no ser una buena idea solo porque no conozco todo el alcance de cómo está utilizando los valores. Si usted es la única entidad que genera los valores (sin mezclar ni combinar), y / o no persiste en los valores, y / o no le importan las colisiones, esto puede no ser un problema. Si alguno de esos elementos no es cierto, es posible que desee volver a evaluar.
fuente
UNIQUEIDENTIFIER
es principalmente una coincidencia. Es conveniente manejar una cantidad de 16 bytes usando ese tipo. Pienso en ello como una contraseña. Sin embargo, tiene que ser único. Estoy seguro de que nunca veré una colisión (e incluso si existe, la aplicación se bloqueará, así que eso también es seguro).De acuerdo con https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newsequentialid-histrorybenefits-and-implementation/ , la función NEWID () simplemente envuelve la función de Windows CoCreateGuid, que devuelve un GUID de estilo v4 . Y de acuerdo con https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11 , desde Windows 2000 en 1999,
Entonces, diría que podría considerar NEWID () criptográficamente seguro, al menos en la medida de los 122 bits de entropía que proporciona.
fuente