Quão Aleatório é System.Guid.NewGuid ()?

Eu sei que isso pode soar como uma pergunta inútil, mas me ouça …

Basicamente quero saber se posso confiar no GUID para gerar um valor que será exclusivo em 100% do tempo e impossível de prever.

Estou basicamente rodando meu sistema de login para um site e quero saber se o GUID é seguro o suficiente para cookies de session.

Qualquer histórico sobre como o GUID é gerado seria muito apreciado na avaliação das respostas.

Obrigado pelos links para duplicar perguntas, no entanto, minha pergunta é específica para o framework .Net.

Aqui está um excelente resumo por Raymond Chen

Nenhum valor de tamanho fixo pode garantir que seja 100% exclusivo (basta chamá-lo de tempos suficientes, dar ou receber o universo terminando ;-p) – mas pode ser muito, muito improvável que seja duplicado.

Eu não posso falar com a previsibilidade de números seqüenciais, mas será único. Eu acho que você seria melhor usar um gerador de números randoms de System.Security.Cryptography, no entanto. Amarre um número random com um valor crescente monotonicamente (tempo) para gerar sua chave exclusiva e você pode ter certeza de que é único e não previsível.

Eu não sei sobre o .net, mas o algoritmo UUID é definido com bastante precisão.

edit: se você olhar os bits apropriados (veja a input da wikipedia), isso deve explicar qual versão do UUID está sendo usada.

edição 2: uma bandeira vermelha para o uso da palavra “seguro”, o que me diz que é melhor usar um método criptográfico bem definido. Por exemplo, ao gerar IDs de session em um servidor, por que não fazer algo simples como aplicar um hash MD5 à concatenação de um subconjunto apropriado do seguinte: {endereço IP da máquina do cliente, contador incremental sequenciado, constante secreta fixa de sua escolha, saída do gerador de números randoms de sua escolha, etc.}

Supondo que System.Guid.NewGuid use CoCreateGuid, ele não é random. Historicamente, o algoritmo usado para criar guias era incorporar o endereço MAC de um adaptador de rede, além de algumas outras coisas, como a hora. Não tenho certeza se o algoritmo foi alterado. Embora certamente não seja random, é garantido que é único.

A documentação do System.Guid.NewGuid () não garante a aleatoriedade, portanto, enquanto a implementação atual é baseada em um gerador de números randoms (é a versão 4 do algoritmo, que foi criada após preocupações com a privacidade da versão 1 que usou o MAC endereço, outros sistemas como o OS X da Apple ainda usam a versão 1 do algoritmo).

Portanto, embora você tenha uma probabilidade muito alta de System.Guid.NewGuid () gerar um valor exclusivo, não é possível fazer suposições sobre sua previsibilidade, porque isso não é especificado pela documentação.

Basicamente quero saber se posso confiar no GUID para gerar um valor que será exclusivo em 100% do tempo e impossível de prever .

Estou basicamente rodando meu sistema de login para um site e quero saber se o GUID é seguro o suficiente para cookies de session .

Resposta curta: de maneira alguma . É importante notar que os únicos e randoms são completamente diferentes. Se você tivesse um contador universal (como pegar um número em uma lanchonete), esses números são únicos, mas completamente previsíveis.

Como Bochu observa acima, o post de Raymond fala sobre isso: https://blogs.msdn.microsoft.com/oldnewthing/20120523-00/?p=7553/

O algoritmo de geração de GUID foi projetado para exclusividade. Não foi projetado para aleatoriedade ou imprevisibilidade. De fato, se você olhar para uma discussão anterior, você pode ver que o chamado Algoritmo 1 é não random e totalmente previsível. … Mesmo o algoritmo GUID da Versão 4 (que basicamente diz “defina a versão como 4 e preencha todo o resto com números randoms ou pseudo-randoms”) não é garantido como imprevisível, porque o algoritmo não especifica a qualidade do random gerador de números.

Para números randoms seguros, você precisa de um gerador de números randoms criptograficamente seguro.

By the way, “rolando meu próprio sistema de login” é uma bandeira vermelha de segurança – eu seria negligente se eu não apontar isso.

Os GUIDs são, por definição, únicos em todos os aspectos. Houve, uma vez, algumas rotinas de geração de GUID0 que estavam gerando GUIDs seqüenciais, mas esses eram problemas em … Win98, eu acho, e foram corrigidos pela Microsoft.

Você deve ser capaz de confiar em um GUID gerado para ser exclusivo e nunca repetido ou regenerado.

(EDIT: Dito isto, todos nós entendemos que uma seqüência de caracteres alfanuméricos tem um número fixo de permutações, se a seqüência de caracteres é fixa em comprimento. Mas, no caso de um GUID, o número de permutações é econômico *.)

(* Droga, onde está aquele XKCD onde os números “astronômicos” propostos não são grandes o suficiente?)