Quão seguro é usar o UUID para identificar algo de maneira exclusiva (estou usando-o para arquivos carregados no servidor)? Pelo que entendi, é baseado em números aleatórios. No entanto, parece-me que, com tempo suficiente, acabaria por se repetir, apenas por puro acaso. Existe um sistema ou um padrão melhor de algum tipo para aliviar esse problema?
guid
uniqueidentifier
uuid
Jason
fonte
fonte
Respostas:
Muito seguro:
Embargo:
Fonte: A seção de probabilidade de duplicatas UUID aleatória do artigo da Wikipedia sobre identificadores universalmente exclusivos (o link leva a uma revisão a partir de dezembro de 2016 antes de editar a seção reformulada).
Consulte também a seção atual sobre o mesmo assunto no mesmo artigo de identificador universalmente universal, Colisões .
fonte
Se, por "tempo suficiente", você quer dizer 100 anos e os cria a uma taxa de um bilhão por segundo, então sim, você tem 50% de chance de ter uma colisão após 100 anos.
fonte
Há mais de um tipo de UUID; portanto, "quão seguro" depende do tipo (que as especificações do UUID chamam de "versão") que você está usando.
A versão 1 é o UUID do endereço MAC com base no tempo. Os 128 bits contêm 48 bits para o endereço MAC da placa de rede (atribuído exclusivamente pelo fabricante) e um relógio de 60 bits com uma resolução de 100 nanossegundos. Esse relógio termina no 3603 AD, para que esses UUIDs estejam seguros pelo menos até então (a menos que você precise de mais de 10 milhões de novos UUIDs por segundo ou alguém clone sua placa de rede). Digo "pelo menos" porque o relógio começa em 15 de outubro de 1582, então você tem cerca de 400 anos depois que o relógio termina antes que haja uma pequena possibilidade de duplicação.
A versão 4 é o número aleatório UUID. Há seis bits fixos e o restante do UUID tem 122 bits de aleatoriedade. Veja a Wikipedia ou outra análise que descreve como é improvável uma duplicata.
A versão 3 usa MD5 e a versão 5 usa SHA-1 para criar esses 122 bits, em vez de um gerador de números aleatórios ou pseudo-aleatórios. Portanto, em termos de segurança, é como se a Versão 4 fosse um problema estatístico (desde que você tenha certeza de que o algoritmo de resumo está processando é sempre único).
A versão 2 é semelhante à versão 1, mas com um relógio menor, o que possibilitará a instalação muito mais cedo. Mas como os UUIDs da versão 2 são para DCE, você não deve usá-los.
Portanto, para todos os problemas práticos, eles são seguros. Se você não se sentir à vontade em deixar as probabilidades (por exemplo, você é o tipo de pessoa preocupada com a destruição da Terra por um grande asteróide em sua vida), certifique-se de usar um UUID da versão 1 e é garantido que ele seja único ( em sua vida, a menos que você planeje viver além do 3603 AD).
Então, por que todo mundo simplesmente não usa os UUIDs da versão 1? Isso ocorre porque os UUIDs da versão 1 revelam o endereço MAC da máquina em que foi gerado e podem ser previsíveis - duas coisas que podem ter implicações de segurança para o aplicativo que usa esses UUIDs.
fonte
A resposta para isso pode depender muito da versão do UUID.
Muitos geradores UUID usam um número aleatório da versão 4. No entanto, muitos deles usam o Pseudo um gerador de números aleatórios para gerá-los.
Se um PRNG mal propagado com um pequeno período for usado para gerar o UUID, eu diria que não é muito seguro.
Portanto, é tão seguro quanto os algoritmos usados para gerá-lo.
Por outro lado, se você souber a resposta para essas perguntas, acho que um uuid da versão 4 deve ser muito seguro de usar. Na verdade, estou usando-o para identificar blocos em um sistema de arquivos de blocos de rede e até agora não houve um conflito.
No meu caso, o PRNG que estou usando é um twister de mersenne e estou sendo cuidadoso com o modo como é propagado, proveniente de várias fontes, incluindo / dev / urandom. Mersenne twister tem um período de 2 ^ 19937 - 1. Vai demorar muito, muito tempo até eu ver um uuid repetido.
fonte
Citando da Wikipedia :
Ele continua explicando com bastante bons detalhes como é realmente seguro. Então, para responder sua pergunta: Sim, é seguro o suficiente.
fonte
Eu concordo com as outras respostas. Os UUIDs são seguros o suficiente para quase todos os propósitos práticos 1 e certamente para os seus.
Mas suponha (hipoteticamente) que não sejam.
Aqui estão algumas abordagens:
Use um UUID maior. Por exemplo, em vez de 128 bits aleatórios, use 256 ou 512 ou ... Cada bit adicionado a um UUID do tipo 4 reduzirá pela metade a probabilidade de uma colisão, assumindo que você tenha uma fonte confiável de entropia 2 .
Crie um serviço centralizado ou distribuído que gere UUIDs e registre todos e cada um que já emitiu. Cada vez que gera um novo, ele verifica se o UUID nunca foi emitido antes. Esse serviço seria tecnicamente simples de implementar (eu acho) se assumirmos que as pessoas que executam o serviço são absolutamente confiáveis, incorruptíveis, etc. Infelizmente, eles não são ... especialmente quando existe a possibilidade de as organizações de segurança dos governos interferirem. Assim, esta abordagem é provavelmente impraticável, e pode ser 3 impossível no mundo real.
1 - Se a singularidade dos UUIDs determinasse se os mísseis nucleares foram lançados na capital do seu país, muitos de seus concidadãos não se convenceriam de "a probabilidade é extremamente baixa". Daí a minha qualificação "quase toda".
2 - E aqui está uma pergunta filosófica para você. Alguma coisa é realmente aleatória? Como saberíamos se não fosse? O universo como o conhecemos é uma simulação? Existe um Deus que possa "ajustar" as leis da física para alterar um resultado?
3 - Se alguém souber de algum trabalho de pesquisa sobre esse problema, comente.
fonte
Os esquemas UUID geralmente usam não apenas um elemento pseudo-aleatório, mas também a hora atual do sistema e algum tipo de ID de hardware frequentemente único, se disponível, como um endereço MAC de rede.
O objetivo principal do uso do UUID é que você confia nele para oferecer um ID melhor do que você seria capaz de fazer. Essa é a mesma lógica por trás do uso de uma biblioteca de criptografia de terceiros, em vez de criar a sua própria. Fazer você mesmo pode ser mais divertido, mas geralmente é menos responsável.
fonte
Faz isso há anos. Nunca tenha problemas.
Normalmente, configuro meus bancos de dados para ter uma tabela que contém todas as chaves e as datas modificadas e outras. Nunca deparei com um problema de chaves duplicadas.
A única desvantagem disso é que, quando você está escrevendo algumas consultas para encontrar rapidamente algumas informações, está copiando e colando muitas chaves. Você não tem mais os IDs curtos e fáceis de lembrar.
fonte
Aqui está um trecho de teste para você testar suas exclusões. inspirado pelo comentário de @ scalabl3
Se você tiver sorte, marque a caixa de seleção, que verifica apenas os IDs gerados atualmente. Se você deseja uma verificação do histórico, deixe-a desmarcada. Observe que você pode ficar sem memória RAM em algum momento se você a deixar desmarcada. Tentei torná-lo compatível com a CPU, para que você possa abortar rapidamente quando necessário, basta pressionar o botão de snippet de execução novamente ou sair da página.
fonte
Não sei se isso é importante para você, mas lembre-se de que os GUIDs são globalmente exclusivos, mas as subseqüências dos GUIDs não são .
fonte
Para o UUID4, considero que existem aproximadamente tantos IDs quanto grãos de areia em uma caixa em forma de cubo com lados de 360.000 km de comprimento. Essa é uma caixa com lados ~ 2 1/2 vezes mais que o diâmetro de Júpiter.
Trabalhando para que alguém possa me dizer se eu estraguei as unidades:
fonte