Boteco Digital

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âmentro, no caso 16.

Bom era isso, t++

Categorias Java
comments powered by Disqus