Pretendo usar um UNIQUEIDENTIFIER
como uma chave de acesso que os usuários possam usar para acessar determinados dados. A chave atuará como uma senha nesse sentido.
Preciso gerar vários identificadores como parte de uma INSERT...SELECT
declaração. Por motivos de arquitetura, desejo gerar os identificadores do lado do servidor nesse caso.
Como posso gerar uma aleatoriamente segura 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 System.Security.Cryptography.RandomNumberGenerator porque preciso de IDs indiscutíveis. Qualquer coisa baseada em CHECKSUM
, RAND
ou GETUTCDATE
também não se qualificaria.
4
. Mas o fato de eu não ter fortes evidências de que possam ser adivinhadas não significa que não. Não posso basear essa decisão de segurança nessa observação.Respostas:
Deveria fazer o truque que eu teria pensado.
CRYPT_GEN_RANDOM
fonte
Apenas meus dois centavos, mas isso pode não ser uma boa ideia. Parafraseando a excelente série de Eric Lippert nos GUIDs ( parte 1 , parte 2 , parte 3 ), o acrônimo é GUID, não GSUID - Identificador Globalmente Único, não Identificador Único Globalmente Seguro.
O problema reside no fato de que, quando os GUIDs são gerados em um escopo não hostil, como todos que usam NEWID (), todos os valores são garantidos como únicos (bem, mais ou menos, consulte o artigo de Eric, parte 3). Porém, se uma entidade hostil entrar nesse escopo, poderá prever o próximo GUID gerado e 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 tornou essencialmente uma entidade hostil. Você alterou o contrato de um GUID de exclusivo para aleatório . Enquanto alguém melhor em matemática do que eu provavelmente poderia provar que você ainda é único, isso está apenas dentro dos limites do seu método de geração. Se você combinar esses pseudo-GUIDs com os NEWID () GUIDs, todas as apostas serão desativadas.
Eu digo que isso pode não ser uma boa idéia 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 combinação e correspondência) e / ou não persiste nos 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.
fonte
UNIQUEIDENTIFIER
é principalmente uma coincidência. É conveniente lidar com uma quantidade de 16 bytes usando esse tipo. Eu penso nisso como uma senha. Tem que ser único, no entanto. Estou confiante de que nunca virei uma colisão (e mesmo se houver o aplicativo falhará - também é seguro).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 do Windows CoCreateGuid, 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ê poderia considerar NEWID () criptograficamente seguro - pelo menos na extensão dos 122 bits de entropia que ele fornece.
fonte