SHA-256 retornando valores diferentes em Java e javascript

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

Seguem as classes:

[code]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();
	
}

}[/code]

[code]package classes;

import java.security.NoSuchAlgorithmException;

public class CriptografiaSHA256 extends CriptografiaGenerica {

public String encriptar(String valor) throws NoSuchAlgorithmException {
	return encriptarPorAlgoritmo("SHA-256", valor);
}

}[/code]

[code]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"));
}

}[/code]

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.

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.

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

[code]import java.security.NoSuchAlgorithmException;

public class CryptographySHA256 extends CryptographyGeneric implements Cryptography {

public String encrypt(String value) throws NoSuchAlgorithmException {
return encryptByAlgorithm(“SHA-256”, value);
}

}[/code]

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

Testei outro exemplo e retorna o mesmo hash.

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

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.