2017-09-30 6 views
-1

J'utilise FileInputStream enveloppé avec BufferedInputStream pour lire dans un fichier volumineux en morceaux d'octets.Hmac MD5 d'un fichier volumineux

public void MD5(BufferedInputStream in, Key pubKey) throws Exception{ 

     Mac md = Mac.getInstance("HmacMD5"); 
      md.init(pubKey); 
      byte[] contents = new byte[1024]; 
      int readSize; 
      while ((readSize = in.read(contents)) != -1) { 
       { 
        md.update(contents,0,readSize); 
       } 
       byte[] hashValue = md.doFinal(); 

      } 
} 

Il fonctionne parfaitement bien pour un petit fichier, mais prend des quantités folles de temps pour un fichier de 200 Mo de fichier.

La même approche fonctionne parfaitement bien pendant que j'essaie de signer le fichier de 200 Mo en utilisant SHA256withRSA.

Y a-t-il une raison spécifique à cela? J'ai le sentiment que c'est quelque chose à voir avec md.update().

Mais j'ai utilisé la même fonction tout en utilisant 'Signature'.

Toute aide serait appréciée.

+0

Vous pouvez ajouter un journal pour vérifier ce qui prend un temps fou. –

Répondre

4

Vous appelez doFinal dans la boucle while. Cela ne semble pas juste. Essayez ce qui suit:

public void MD5(BufferedInputStream in, Key pubKey) throws Exception{ 
    Mac md = Mac.getInstance("HmacMD5"); 
    md.init(pubKey); 
    byte[] contents = new byte[1024]; 
    int readSize; 
    while ((readSize = in.read(contents)) != -1) { 
     md.update(contents, 0, readSize); 
    } 
    byte[] hashValue = md.doFinal(); 
} 
+0

Il ferait aussi bien d'utiliser un tampon beaucoup plus grand, disons 8k ou 32k. – EJP