Criptografia + Character Encoding + Linux + Windows = Problema!

Pessoal,

estou com um problema ao criptografar senhas, e talvez alguém aqui possa me ajudar. Há alguns anos, desenvolvi um sistema para rodar no Tomcat no Windows que criptografava as senhas da seguinte forma:

MessageDigest md = MessageDigest.getInstance(“SHA”);
byte[] hash = s.getBytes();
hash = md.digest(hash);
String palavra = new String(hash);

Nesta semana, fui solicitado para instalar este mesmo sistema em Linux. Ok, eu pensei, instalei o Linux, o Java e o Tomcat e joguei a aplicação no Tomcat. Mas não consegui logar no sistema, dando mensagem de erro de senha. Debugando, vi que o resultado em ‘palavra’ no código acima era diferente no Linux e no Windows. Pesquisando, descobri que tratava-se de um problema de character enconding.

Charset.defaultCharset().name(), no Windows => “windows-1252”
Charset.defaultCharset().name(), no Linux => “UTF-8”

Mudei o código para:

MessageDigest md = MessageDigest.getInstance(“SHA”);
byte[] hash = s.getBytes(“windows-1252”);
hash = md.digest(hash);
String palavra = new String(hash, “windows-1252”);

No windows, continuou funcionando, mas no Linux continuou não funcionando!!!

O interessante é que se eu mudar para “UTF-8” no código acima, muda o resultado em ‘palavra’ no Windows, que fica igual ao Linux, e para de funcionar.

No linux, tanto faz “windows-1252” ou “UTF-8”, o resultado é o mesmo.

Ou seja, parece que o Linux ignora o nome da codificação que eu passo!!!

Alguém tem alguma idéia?

Em vez de usar “Windows-1252” que tal usar “ISO-8859-1”?

Já tentei, mas também não deu certo. Acho que não é uma questão de qual Character Enconding usar, mas sim de como fazer ele ser utilizado pelo linux.

A propósito, a chamada

Charset.isSupported(“windows-1252”)

retirna true no linux.

No arquivo %CATALINA_HOME%\bin\catalina.bat adicionem a seguinte linha na seção de configuração ( um conjunto de linhas que inicial com “set” depois dos comentários “rem” ):

set CATALINA_OPTS=-Dfile.encoding=ISO8859_1

Fonte: http://mail.opencms.org/pipermail/opencms-dev/2002q4/002751.html

Recomendo dtrabalhar com UTF-8 (pelo menos é a codificação que deveria passar a ser usada, e tente a se tornar a padrão em qualquer S.O).

lap_junior, nao funcionou.

Kknd, vc tem razao, mas mudar agora eh um pouco dificil para mim, pois jah tem um monte de senhas criptografadas no banco.

Mas teoricamente era para funcionar o codigo modificado, nao? o charset esta disponivel (pois Charset.isSupported(“windows-1252”) retorna true), e estou dizendo explicitamente qual charset usar…

De qualquer maneira:

Nunca faça isto, nunca mesmo, para arrays de bytes quaisquer (como o resultado de um hash). Na próxima vez que você escrever um programa que usa um array de bytes, converta para hexadecimal ou base-64.

O código que funcionou:

MessageDigest md = MessageDigest.getInstance(“SHA”);
byte[] hash = s.getBytes(“Cp1252”);
hash = md.digest(hash);
String palavra = new String(hash, “Cp1252”);

A justificativa:

http://java.sun.com/j2se/1.5.0/docs/guide/intl/encoding.doc.html