Gerando Hash em Java
Um hash é uma sequencia de bits geradas por um algoritmo de dispersão, normalmente representado em forma hexadecimal, buscando transformar uma grande quantidade de dados em uma pequena quantidade que os represente. O processo de hash é um processo de somente uma via, já que uma vez gerado através de uma informação não é possível utilizar o hash para obter a informação original.
Um hash busca identificar uma informação unicamente, e é muito utilizada para fazer checksums de arquivos e embaralhar senhas para que estas não fiquem como texto puro no banco por exemplo.
Um hash tem o tamanho de sua sequencia limitado(normalmente não passando de 512 bits), ocasionando em possível colisões. Uma colisão é quando temos duas sequencias iguais para informações diferentes. Quanto maior a dificuldade de criar colisões melhor o algoritmo.
Os algoritmos mais comuns para criar hash são:
- MD5 (Message-Digest algorithm 5): é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security Inc., muito utilizado por softwares com protocolo P2P, verificação de integridade e logins. Existem alguns métodos de ataque divulgados para o MD5.
- SHA-1 (Secure Hash Algorithm): é um algoritmo de hash de 160 bits desenvolvido pelo NIST e NSA. Faz parte do conjunto SHA nomeados SHA-0, SHA-1, SHA-2 e SHA-3. Já foram descobertos ataques sobre o SHA-1 fazendo o NIST(Instituto Nacional de Padrões e Tecnologia – Americano) exigir que as agencias federais passem a utilizar o SHA-2.
- SHA-2 (Secure Hash Algorithm): SHA-2 inclui mudanças significativas de seu antecessor, SHA-1. A família SHA-2 é composta por seis funções hash com resumos (valores de hash) que são de 224, 256, 384 ou 512 bits: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256.
Vamos ao códigos então:
String s="123mudar";
try {
MessageDigest m = MessageDigest.getInstance("MD5");
m.update( s.getBytes(), 0 , s.length() );
byte[] digest = m.digest();
String hexa = new BigInteger(1,digest).toString(16);
System.out.println("MD5: " + hexa);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
Na linha 3 criamos um objeto MessgeDigest
que implementa um algoritmo de hash o qual especificamos no parâmetro do método getInstance
, podemos utilizar por exemplo, md5, sha-1 ou sha-256.
Na linha 5 chamamos o método update
para adicionar as informações as quais que queremos gerar o hash. Este método recebe como parâmetro um array de bytes e como neste exemplo queremos obter o hash de uma string temos que convertê-la através do método getBytes
. Como segundo parâmetro colocamos a posição inicial do array que queremos adicionar e como terceiro a posição final. Este método pode ser chamado sucessivas vezes, permitindo ir adicionando as informações que irão gerar o hash aos poucos, particularmente útil se estamos lendo um arquivo por exemplo e queremos gerar o hash dele.
Na linha 7 chamamos o método digest que irá realizar o calculo do hash e retornar um array de bytes com o valor do hash.
Na linha 9 convertermos o array de bytes no formato hexadecimal, utilizando a classe BigInteger
com um construtor que recebe um inteiro como primeiro parâmetro que representa o sinal do número e como segundo o array de bytes para gerar o número. Para convertê-lo para hexadecimal chamamos o método toString()
passando a base como parâmetro, no caso 16.
Bom era isso, t++