SHA-256 retornando valores diferentes em Java e javascript

4 respostas
E

Pessoal, é o seguinte: eu criei um projeto de testes aqui pra criar o hash SHA256 de uma entrada qualquer

Seguem as classes:

package classes;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//import sun.misc.BASE64Encoder;
import org.apache.commons.codec.binary.Base64;

public class CriptografiaGenerica {

	private MessageDigest messageDigest;
	private Base64 encoder;
	
	protected void usarAlgoritmo(String algoritmo) throws NoSuchAlgorithmException {
		if ((messageDigest == null) || messageDigest.getAlgorithm() != algoritmo) {
			messageDigest = MessageDigest.getInstance(algoritmo);
		}
		if (encoder == null) {
			encoder = new Base64();
		}
	}
	
	protected String encriptarPorAlgoritmo(String algoritmo, String valor) throws NoSuchAlgorithmException{
		if (valor == null) {
			throw new IllegalArgumentException("O valor é nulo");
		}
		usarAlgoritmo(algoritmo);
		byte[] hash = messageDigest.digest(valor.getBytes());
		return encoder.encodeAsString(hash).toString();
		
	}
}
package classes;

import java.security.NoSuchAlgorithmException;

public class CriptografiaSHA256 extends CriptografiaGenerica  {
	
	public String encriptar(String valor) throws NoSuchAlgorithmException {
		return encriptarPorAlgoritmo("SHA-256", valor);
	}
	
}
package classes;

import java.security.NoSuchAlgorithmException;

public class Teste {

	public static void main(String[] args) throws NoSuchAlgorithmException{
		CriptografiaSHA256 sha256 = new CriptografiaSHA256();
		System.out.println("abc em SHA-256: " + sha256.encriptar("abc"));
	}
	
}

Ela funciona que é uma beleza, retornando "ungWv48Bz+pBQUDeXa4iI7ADYaOWF3qctBD/YfIAFa0=" para a entrada abc.
Só que preciso fazer isso com javascript também, então peguei vários algoritmos prontos por ai, e o resultado para a mesmo entrada abc retorna o valor "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad".

Pra quem quiser verificar a do javascript aqui está o link, é só informar "abc" la no campo e ele gera o hash.

To nisso o dia todo, e não encontrei resposta do pq disso ainda. Quem tiver alguma vaga idéia do que seja, eu agradeceria muito se ajudasse.

Muito obrigado desde já, abraços.

4 Respostas

E

Contando aqui, reparei que a hash gerada pelo meu código Java não tem 64 caracteres. Será que é por causa do meu encoder (Base64)?
Eu usei esse tutorial como base: http://rodrigolazoti.com.br/2008/10/03/como-utilizar-criptografia-em-java/ que usa a classe import sun.misc.BASE64Encoder como o encoder pro base64, mas como não tava conseguindo o import aqui, e li pessoas desencorajando o uso desta classe, to usando o jar do apache no lugar dela, a org.apache.commons.codec.binary.Base64.

Abraços.

E

Pelo que percebi, o autor do tutorial usa a interface Cryptography a qual eu não usei e aparece ai embaixo

import java.security.NoSuchAlgorithmException;
 
public class CryptographySHA256 extends CryptographyGeneric implements Cryptography {
 
public String encrypt(String value) throws NoSuchAlgorithmException {
return encryptByAlgorithm("SHA-256", value);
}
 
}

Porém, não consigo encontrar esta interface em nenhunm pacote.

E

Testei outro exemplo e retorna o mesmo hash.

Como pode? O resultado era pra ser o msm em javascript e java.

G

Oi,

Não cheguei a analisar o código que faz o hash em javascript, mas só um toque:

Quando você converte a string para bytes poderá ter resultados diferentes dependendo do Encoding utilizado, como você está usando o encoding padrão então não dá para garantir que será o mesmo. Ou seja, talvez esteja dando resultado diferente porque você sequer está gerando hash dos mesmos bytes.

Tente padronizar o encoding nos dois lados, ou mesmo testar colocando na entrada um array de bytes instanciado na mão, apenas como teste.

Criado 30 de outubro de 2012
Ultima resposta 30 de out. de 2012
Respostas 4
Participantes 2