Quão seguramente indiscutíveis são os GUIDs?

Há algum tempo, trabalhei em um aplicativo da web onde os usuários podiam comprar ingressos. Devido à forma como os processos de nossos clientes funcionavam, o que você conseguiu como resultado de sua compra foi um URL com o número do ticket.

Tratava-se de ingressos para a compra de imóveis no Oriente Médio, e cada bilhete potencialmente valia cerca de US $ 3.000.000. Descobrir claramente números inteiros seqüenciais teria sido uma má ideia. Usamos GUIDs, pois são basicamente indiscutíveis, mas minha pergunta é: eles são seguros o suficiente?

Pelo que entendi, os GUIDs que o .NET produz são totalmente pseudo-aleatórios (exceto por alguns bits não variáveis). No entanto, não sei qual algoritmo é usado para gerá-los.

A documentação do MSDN nos diz queRandom é rápido e inseguro, eRNGCryptoServiceProvider é lento e seguro. Ou seja, é razoável supor que alguém possa se esforçar o suficiente para prever o resultado deRandom, mas não deRNGCryptoServiceProvider.

Se você visse uma sequência suficientemente longa de GUIDs, seria possível prever as futuras? Se sim, quantos você precisaria ver?

[No nosso caso particular, houve verificações de segurança física mais tarde - você teve que apresentar o passaporte usado para comprar sua passagem - para que não fossetambém ruim se alguém tivesse adivinhado o GUID de outra pessoa, para não suarmos naquele momento. A conveniência de usar o GUID como uma chave de banco de dados o tornou um tipo de dados útil.]

Editar:

Portanto, a resposta é "insuficiente".

Usando0xA3da resposta abaixo e seguindo os links doPergunta, questão ele vinculado a, o código a seguir gerará um GUID criptograficamente aleatório válido porSeção 4.4 da RFC 4122:

static Guid MakeCryptoGuid()
{
    // Get 16 cryptographically random bytes
    RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
    byte[] data = new byte[16];
    rng.GetBytes(data);

    // Mark it as a version 4 GUID
    data[7] = (byte)((data[7] | (byte)0x40) & (byte)0x4f);
    data[8] = (byte)((data[8] | (byte)0x80) & (byte)0xbf);

    return new Guid(data);
}

Isso produz GUIDs muito mais lentamente do queGuid.NewGuid(), mas com 122 bits de dados "muito aleatórios", eles são imprevisíveis com segurança.

Obviamente, qualquer texto criptograficamente aleatório seria útil para um número de ticket, mas os GUIDs são bastante úteis. :-)

Como em outros GUIDs da versão 4, não há garantia absoluta de exclusividade, mas as chances são impressionantes. Desde que você tenha menos de 326.915.130.069.135.865 (ou seja,sqrt (-2 * 2 ^ 122 * ln (0,99))) GUIDs em jogo simultaneamente, você pode ter mais de 99% de certeza de que não há colisões. Em outras palavras: se como o meu, seu aplicativo terá erros de transbordamento em todo o lugar, se você tiver mais deint.MaxValue de praticamente qualquer coisa, você pode ter mais de 99,99999999999999999% de certeza de nenhuma colisão (ou seja,e ^ - (((2 ^ 31-1) ^ 2) / (2 * 2 ^ 122))) Isso é cerca de mil vezes mais seguro do que você pode ter de que um meteorito não destrói a maior parte da vida na Terra dentro de um segundo após a aplicação ser ativada (ou seja,um por 100 milhões de anos)

questionAnswers(3)

yourAnswerToTheQuestion