Pretendo usar a UNIQUEIDENTIFIER
como uma chave de acesso que os usuários possam usar para acessar determinados dados. A chave funcionará como uma senha nesse sentido.
Preciso gerar vários desses identificadores como parte de uma INSERT...SELECT
declaração. Por motivos de arquitetura, desejo gerar os identificadores do lado do servidor neste caso.
Como posso gerar um aleatório com segurança UNIQUEIDENTIFIER
? Observe que NEWID
isso não seria aleatório o suficiente, pois não promete nenhuma propriedade de segurança. Estou procurando o equivalente do SQL Server de System.Security.Cryptography.RandomNumberGenerator porque preciso de IDs indecifráveis. Qualquer coisa baseada em CHECKSUM
, RAND
ou GETUTCDATE
também não se qualificaria.
Deve fazer o truque que eu teria pensado.
CRYPT_GEN_RANDOM
Apenas meus dois centavos, mas isso pode não ser uma boa ideia. Parafraseando a excelente série de Eric Lippert sobre GUIDs ( parte 1 , parte 2 , parte 3 ), o acrônimo é GUID, não GSUID - Globally Unique Identifier, não Globally Secure Unique Identifier.
O problema reside no fato de que, quando os GUIDs são gerados em um escopo não hostil, como todos usando NEWID(), todos os valores são garantidos como exclusivos (bem, mais ou menos, consulte o artigo de Eric, parte 3). Mas se uma entidade hostil entrar nesse escopo, elas podem prever o próximo GUID gerado, bem como causar colisões por conta própria.
Ao criar seu próprio método de gerar um valor que você armazena dentro de uma estrutura que se parece com um GUID, você se torna essencialmente uma entidade hostil. Você alterou o contrato de um GUID de exclusivo para aleatório . Embora alguém melhor em matemática do que eu provavelmente possa provar que você ainda é único, isso está apenas dentro dos limites do seu método de geração. Se você misturar esses pseudo-GUIDs com GUIDs NEWID(), todas as apostas serão canceladas.
Digo que isso pode não ser uma boa ideia apenas porque não conheço todo o escopo de como você está usando os valores. Se você é a única entidade que gera os valores (sem misturar e combinar) e/ou não está mantendo os valores e/ou não se importa com colisões, isso pode não ser um problema. Se algum desses itens não for verdadeiro, convém reavaliar.
De acordo com https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newsequentialid-histrorybenefits-and-implementation/ , a função NEWID() apenas envolve a função CoCreateGuid do Windows, que retorna um GUID no estilo v4 . E de acordo com https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11 , desde o Windows 2000 em 1999,
Então, eu diria que você pode considerar NEWID() criptograficamente seguro - pelo menos até os 122 bits de entropia que ele fornece.