Pergunta

Ontem eu perguntei são GUIDs gerado na segurança do Windows 2003 para uso como IDs de sessão? ea resposta combinada com combinada com este artigo GUIDs são globalmente únicos, mas substrings de GUIDs não são me levou a pensar em substituir o meu actual mecanismo de usar GUIDs como ID da sessão de em cookies.

Porque é um pouco de trabalho para fazer essa mudança, decidi fazer um teste GUID rápida no meu Vista PC para ver se uma seqüência de GUIDs era obviamente determinista (o que eu estou preocupado é se um atacante foi capaz de obter uma sequência de GUIDs gerados pelo meu servidor eles seriam capazes de gerar novos correspondentes).

O artigo de De Raymond Chen (que faz referência esta muito antiga especificação UUIDs e GUIDs de 1998), o GUID é composta de:

  • 60 bits de timestamp,
  • 48 bits de identificador de computador,
  • 14 bits de uniquifier e
  • seis bits são fixos

Indo por que se eu gerar 10 GUIDs os primeiros 15 chars ASCII (excluindo '-') são o timestamp, os próximos 12 caracteres ASCII são o identificador de computador, os próximos 3,5 caracteres ASCII são aleatórios e os últimos 1,5 personagens são fixos .

Começar 10 GUIDs no meu PC Vista usando o .Net System.Guid.NewGuid () rendimentos:

b4e95ead-3619-4dc2-9102-cf7ab0efd927
a45ee719-decd-46b2-8355-7becbe406f74
9af68d75-35a0-4907-b6ab-f15e33acfe96
bed88fa3-3209-4a19-97dd-85d5428ea5f4
123cb39b-8d81-41c6-8894-f1257a8f7606
e2b1f6b1-5791-4a18-80a9-5dc668574ecb
c52aa660-2629-4659-bb83-5583081e5a1c
76eda32d-ceda-412e-8ade-30c47416e954
cbc4d45e-7281-40d2-9f90-00539b04fe98
be36524c-267c-4791-bc9e-3c20b29d7615

O padrão única discernível de uma rápida inspeção visual é que o personagem 13 ASCII é sempre 4.

Estou novamente à esquerda perguntando se depender de System.Guid para gerar pseudo IDs de sessão aleatórios é forte o suficiente para proteger uma aplicação web, onde rachaduras um ID de sessão valeria a pena na maioria dos milhares de dólares?

Update: Em vez de usar um GUID I agora planejar para gerar o meu ID da sessão de usar a abordagem abaixo. Eu estou convertendo a 384 mordeu número aleatório para uma string 0x00 byte de modo que é adequado para uso em um cookie HTTP.

RNGCryptoServiceProvider rngProvider = new RNGCryptoServiceProvider();
byte[] myKey = new byte[48];
rngProvider.GetBytes(myKey);
string sessionID = null;
myKey.ToList().ForEach(b => sessionID += b.ToString("x2"));
Console.WriteLine(sessionID);
Foi útil?

Solução

Não é uma resposta completa, mas posso dizer-lhe que o dígito 13 hex é sempre 4 porque denota a versão do algoritmo usado para gerar o GUID (id est, v4); também, e cito Wikipedia:

Cryptanalysis do WinAPI GUID mostra geradores que, uma vez que o sequência de V4 Guids é pseudo-aleatória, dado o estado inicial uma lata prever-se para os próximos 250 000 GUIDs retornado pela função UuidCreate. É por isso que GUIDs não deve ser utilizado em criptografia, por exemplo, como chaves aleatórias.

O resto do artigo, e as suas referências: http://en.wikipedia.org/wiki/ Guid

- Edit -

Do ponto de vista de segurança, eu sugiro que você gerar o seu ID da sessão, contudo, você se sentir como, então cryptographically assiná-lo; Dessa forma, você pode embalar em qualquer informação que você quer e, em seguida, apenas tapa uma assinatura no final - a eventual emissão sendo o equilíbrio entre o tamanho / força de sua chave e o tamanho resultante do cookie. GUIDs são úteis como IDs, mas eu só dependem de uma técnica criptográfica dedicada para a segurança.

Outras dicas

Eu sugiro que você use o System.Security.Cryptography.RandomNumberGenerator. Este é concebido para produzir números, que não podem ser manipuladas inversa. A motivação de Guid é ser único. Você pode combinar tanto o GUID e seguro número aleatório, mas um número aleatório de 128 bits segura é nunca vai ter uma colisão na prática.

Algumas notas:

  1. Eu duvido que qualquer implementação de GUIDs foi projetado para ser cryptograhpically seguro. (E esta suposição seria corroborada pelo artigo ligado para o próximo item).
  2. O caráter 13 ASCII é um significante de o algoritmo foi utilizado para gerar o GUID .

Se você está realmente preocupado com ter IDs de sessão fortes, então talvez um hash criptograficamente segura de algo que não pode ser determinada a partir de off-máquina seria a melhor abordagem. Talvez gerando um tempo uma almofada de alguma fonte de documentos ou dados internos seria mesmo trabalho.

O que você está tentando fazer? Você quer apenas uma fonte de números aleatórios?

Confira random.org e hotbits . Há muitos e muitos anos atrás, eu tinha uma biblioteca Java que reunisse os números a partir destas fontes, e juntá-las, para obter um muito bonito série aleatória (embora ele assume os dois sites não estão em cahootz).

A resposta curta é, há de guid não são suficientemente forte para gerar sessão ID do se você quer evitar id de sessão de adivinhação e rachaduras.

Pela mesma razão por que você não iria querer usar um GUID como uma chave AES, você não quiser usá-los para qualquer tipo de identifica sensíveis.

A GUID funciona muito bem para o que eles são projetados para serem:. Um matematicamente guarenteed identificação única de nunca repita

Mesmo se rachar um ID da sessão é de apenas US $ 1000, imagine se isso é feito 100 vezes. Agora você está falando sério bling.

Eu sei que é um caminho mais fácil de usar GUID de mas resistir, e lidar com a dor, tomando as devidas precauções para proteger adequadamente sua aplicação. Seus usuários obrigado.

É quase impossível obter um guid duplicado considerando as possibilidades de conseguir um. Aqui estão alguns fatos matemática rápida

Grãos de areia do mundo 75.000.000.000.000.000.000

Número de GUIDs 340,282,366,920,938,463,463,374,607,431,770,000,000

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top