Gerando chave de autenticação

Estou fazendo um trabalho para a faculdade (disciplina de Programação Orientada a Objetos). O programa tem a seguinte estrutura, cadastro da empresa onde a chave é gerada com alguns dados do cadastro, como por exemplo, o numero do sistema(quantos foram vendidos), pesquisa de empresas cadastradas, para a consulta da chave, verificador de chave, para ver se a mesma é valida, retorna dados, retorna os dados cadastrados a partir da chave. A chave deve seguir o seguinte padrão: ser de base 32, ter o seguinte formato = xxxxX(onde o X é o digito verificador dos 4 anteriores)- seguindo 5 vezes esse padrão(xxxxX-xxxxX-xxxxX-xxxxX-xxxxX). A chave não pode ser gerada com números aleatórios, pois precisa ser feito o processo contrario(tirar os dados da chave).
http://imageshack.us/photo/my-images/820/chavek.png/
Lembrando que eu não quero o código e sim uma ideia para a solução do meu problema.

Desde já Agradeço!!

Se a chave contem 5 códigos (xxxx-xxxx-xxxx-xxxx-xxxx) com 4 bytes cada um (exceto o dígito verificador), isso significa 20 bytes. Isso é muito parecido com uma licença.

Por se tratar de 20 bytes, isso coincide com o SHA1 ou MD5, pois estes são tipos de criptografia para geração de hash e não existe decifragem nestes casos. O hash nunca é o mesmo se a frase é diferente.

Recomento você gerar uma “frase” que concatene todos os dados que você disse que deve ter (cadastro da empresa, número de sistemas …). Ex.:

String frase = "01.001.898/0001-92, 2 sistemas, ..."

Depois pegue o array de bytes da frase e processe por uma função de SHA1 ou MD5, o que você preferir.

Um hash de 20 bytes será retornado pela função, então você particiona em 5 partes de 4 bytes.

Para cada uma das partes, você pode calcular o dígito verificador com alguma regra aritimética tipo somar os 4 bytes e colocar o resultado em um byte a partir de um cast (byte).

Feito tudo isso, ai é você mostrar cada parte e seu dígito verificador na base 32.

Obs.: Este é um roteiro simples para gerar código de licença. Você pode sofisticar o algoritmo para ofuscar a frase antes de achar o hash dela, desta forma dificulta alguém descobrir como é que você gera licença. Pode até acrescentar na frase algumas constantes que identifique o emissor, tudo isso dependerá de sua estratégia.

Opa, para você conferir se uma licença é válida, deve calcular ela do zero e confrontar com a licença informada.

wiliamps

a ideia é boa, mas não sei como fazer desse jeito. Se tiver um exemplo ou outra sugestão, eu agradeço!!

Para converter um inteiro para base-32, você pode usar Integer.toString (com 2 parâmetros).

http://docs.oracle.com/javase/6/docs/api/java/lang/Integer.html#toString(int,%20int)

Por exemplo:

String parte1 =  Integer.toString(1234, 32).toUpperCase();

Se você não faltou às aulas de matemática, vai saber que o maior número que pode ser expresso em Base-32 e tem 4 dígitos é 32 elevado a 4 - 1, ou seja, 1048575. Ou seja, para determinar cada uma das partes, você pode gerar um número aleatório:

static java.util.Random r = new java.util.Random();
...

int parte = r.nextInt (1048576); // gera um número aleatório de 0 até 1048575
int dv = ...; // sei lá como se calcula o seu dígito verificador, fica por sua conta