Identificadores exclusivos que são de fácil utilização e difícil de adivinhar
-
07-07-2019 - |
Pergunta
A minha equipe está trabalhando em um aplicativo com um banco de dados legado que usa dois valores diferentes como identificadores exclusivos para um objeto Grupo: Id
é uma coluna de auto incremento de identidade cujo valor é determinado pelo banco de dados após a inserção. GroupCode
é determinada pela aplicação após inserção, e é "Group" + theGroup.Id
.
O que precisamos é um algoritmo para gerar de GroupCode que:
- são únicos.
- são razoavelmente fácil para um usuário digitar corretamente.
- É difícil para um hacker de adivinhar.
- Você quer criado pelo banco de dados após a inserção, ou são criados pelo aplicativo antes da inserção (ou seja, não depende da coluna de identidade).
A solução existente atende aos dois primeiros critérios, mas não os dois últimos. Alguém sabe de uma boa solução para atender todos os itens acima critérios?
Uma nota mais: Mesmo que este código é usado externamente pelos usuários, e mesmo que Id faria um identificador melhor para outras tabelas de vincular suas chaves estrangeiras para, a GroupCode é utilizada por outras tabelas para se referir a um grupo específico.
Agradecemos antecipadamente.
Solução
Seria possível adicionar uma nova coluna? Ele pode consistir de Identidade e um número de 32 bits aleatórios.
Esse número de 64 bits poderia, então, ser traduzido para um «Memorável aleatórios». Não seria perfeita segurança sábio, mas poderia ser bom o suficiente.
Aqui está um exemplo usando Ruby eo Koremutake gem .
require 'koremu'
# http://pastie.org/96316 adds Array.chunk
identity=104711
r=rand(2**32)<<32 # in this example 5946631977955229696
ka = KoremuFixnum.new(r+identity).to_ka.chunk(3)
ka.each {|arr| print KoremuArray.new(arr).to_ks + " "}
Resultado:
TUSADA REGRUMI LEBADE
Também confira Phonetically memorável senha Geração Algoritmos .
Outras dicas
Você já olhou para Base32 / Base36 codificação de conteúdo? representação Base32 de uma coluna de semente de identidade irá torná-lo único, fácil de entrar, mas definitivamente não é seguro. No entanto a maioria dos não-programadores terão nenhuma idéia de como o valor da cadeia é gerado.
Também usando Base32 / 36 você pode manter chaves primárias baseados inteiros do banco de dados normal.