Gerar hash de arquivo em J2ME

5 respostas
S

Olá,

Alguém sabe alguma maneira de gerar o hash (pode ser MD5) de um arquivo qualquer em J2ME?
O java me, nao tem suporte oficial, teste uma outra opção (esta aqui) mas com a versão para J2ME, pelo que vi só gera o hash para Strings, pois o hash de arquivo sempre está retornando diferente.

Alguem sabe alguma outra maneira de fazer o hash de um arquivo?
Estou realmente precisando disso, é um tanto urgente e não sei mais que fazer :cry: :cry: :cry:

5 Respostas

P

Esta implementação é confiável e trabalha tanto com Strings como arrays de bytes. Reveja o seu código.

S
boone:
Esta implementação é confiável e trabalha tanto com Strings como arrays de bytes. Reveja o seu código.
Então, com as classes que o cara disponibilizou para J2ME ali, eu estava fazendo assim: Em J2ME
private String geraHash(FileConnection novoArquivo) throws IOException {
       
      FileConnection fcup = (FileConnection)Connector.open(novoArquivo.getURL(), Connector.READ);
      InputStream leArquivo = fcup.openInputStream();
      byte[] buffer = new byte[(int)fcup.fileSize()];
      leArquivo.read(buffer);

      String hash;
      MD5 md5 = new MD5(buffer);
     
      md5.Update(buffer);

      byte[] resultado = md5.Final();
      hash = MD5.asHex(resultado);

      return hash; 

  }

Na versão para J2SE (a original), para fazer o MD5 fica assim:

J2SE
private String geraHash(File novoArquivo) throws IOException {
      String hash;
      hash = MD5.asHex(MD5.getHash(novoArquivo));
      return hash;
   }

Na classe J2ME lá não tem o método getHash().
A implementação em J2ME eu peguei de um exemplo que outro cara fez para converter text (string), e modifiquei para enviar o buffer de bytes.

Para um mesmo arquivo (somente em pasta diferente) esta retornando um valor para o hash em J2ME e outro para o em J2SE.

Exemplo:
arquivo algo.txt no cliente J2Me
f3dfe88e2b6690bd22b4a9fc6a423b3d

arquivo algo.txt no servidor J2SE
c5fd644c784d91511124cfcd2e69d7b2

No J2SE, para arquivos iguais, aonde muda somente o nome, o hash retorna igual.
No J2ME, para arquivos iguais, aonde muda somente o nome, o hash retorna diferente para cada um deles.

o que estou fazendo de errado?

S

BINGO.

realmente, tive que alterar uma coisa.
na criação do objeto md5, mudei a chamada do construtor da classe sem parametro, na linha 10.
Não sei porque, mas agora funcionou.

ficou assim:

private String geraHash(FileConnection novoArquivo) throws IOException {
       
      FileConnection fcup = (FileConnection)Connector.open(novoArquivo.getURL(), Connector.READ);
      InputStream leArquivo = fcup.openInputStream();
      byte[] buffer = new byte[(int)fcup.fileSize()];

      leArquivo.read(buffer, 0, (int) fcup.fileSize());

      String hash;
      MD5 md5 = new MD5();
      md5.Update(buffer);
      
      byte[] resultado = md5.Final();
      hash = MD5.asHex(resultado);
      return hash; 

    }

Valeu do mesmo jeito boone. :D

P

Como eu disse, esta classe é uma implementação confiável…

Não me lembro quando usei se fiz igual a você no construtor…mas lembro que acho que usei String.getBytes() em Update() sim…

S
boone:
Como eu disse, esta classe é uma implementação confiável...

Não me lembro quando usei se fiz igual a você no construtor...mas lembro que acho que usei String.getBytes() em Update() sim...

o problema que surgiu foi que eu preciso fazer o hash de arquivos.

mas, para arquivos um pouco maiores (1mb, 2mb) estoura o array de bytes (byte[]), pois não dá para jogar tudo de uma vez lá dentro.
byte[] buffer = new byte[(int)fcup.fileSize()];

Mudei para ler da seguinte forma:

FileConnection fcup = (FileConnection)Connector.open(novoArquivo.getURL(), Connector.READ);
      InputStream leArquivo = fcup.openInputStream();
      byte[] buffer = new byte[8192]; // = new byte[(int)fcup.fileSize()];

      String hash;
      MD5 md5 = new MD5();
      int qde = 0;
      while((qde = leArquivo.read(buffer)) > 0  ) {
         md5.Update(buffer);
      }
      //leArquivo.read(buffer, 0, (int) fcup.fileSize());

      //md5.Update(buffer);
      
      byte[] resultado = md5.Final();
      hash = MD5.asHex(resultado);

mas o hash não sai igual a implementação original em JEE.

Alguma ideia?

Criado 22 de maio de 2011
Ultima resposta 27 de mai. de 2011
Respostas 5
Participantes 2