2017-01-19 4 views
2

Je veux mettre en œuvre le hachage SHA512 en utilisant un sel. J'ai commencé here, menant à cette mcve:Le hachage SHA512 donne des résultats incorrects (?) Lorsqu'il est "salé"

import java.security.MessageDigest; 
import org.junit.Test; 

public class Sha512Mcve { 

    private final String ENCODING = "ISO-8859-1"; 

    @Test 
    public void test() { 
     System.out.println(computeHashFor("whatever")); 
    } 

    private String computeHashFor(String toHash) { 
     String salt = "salt"; 
     MessageDigest md; 
     try { 
      md = MessageDigest.getInstance("SHA-512"); 
//   md.update(salt.getBytes(ENCODING)); 
      byte[] bytes = md.digest(toHash.getBytes(ENCODING)); 

      return toUnixRepresentation(salt, bytes); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    private String toUnixRepresentation(String salt, byte[] bytes) { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("$6$"); 
     sb.append(salt); 
     sb.append("$"); 

     for (int i = 0; i < bytes.length; i++) { 
      int c = bytes[i] & 0xFF; 
      if (c < 16) sb.append("0"); 
      sb.append(Integer.toHexString(c)); 
     } 
     return sb.toString(); 
    } 
} 

chose est: quand je quitte la ligne md.update() commentaire, ce code me donne les exactement les mêmes résultats que certains générateurs de hachage en ligne (comme celui-ci one) . Par exemple, hacher le mot "what" donne une valeur hash ae3d .... 63a. Mais quand j'exécute mon code avec cette opération au sel, je l'utilise. Je reçois différents résultats (encore une fois comparé à cet outil en ligne, qui permet de définir une chaîne de sel, aussi). Ma mise en œuvre entraîne 413 ... 623; l'outil en ligne dit F25 ... 686.

Toute explication de quelle manière le "salage" conduit à des résultats "spécifiques à la mise en œuvre"?

Y a-t-il quelque chose que je devrais faire différemment dans mon code?

+0

Si vous recherchez le hachage de mot de passe, la méthode de hachage n'utilise pas simplement un hachage. S'il vous plaît se référer à https://en.wikipedia.org/wiki/Crypt_%28C%29 Aussi si vous le souhaitez, j'ai une implémentation Java qui fonctionne pour sha256 et sha512 (écrit à partir de rien) –

Répondre

2

Sel avant ou après?

Qu'est-ce que la calculatrice fait quand vous définissez l'option de sel

whateversalt

Ce que vous faites dans votre code

saltwhatever

Resutls de la calculatrice

whateversalt

F2527142C752B05467EE53B44735397F5B4C870DF0F154A0CF3AC23B31CF42EE7E1002D326B57DF60ED4B7449CF101290BDC0BECCB677AAAD846CFBE140DF686 

saltwhatever

41333B9BAFC14CB3D1106D72A5D461F348B9EA1304A82989E00E5FC2D3239339492FCA12ED5EBF5F6802955C95B5F7ADA4CA035A911C2F29ABE905C3923CF623 

Par conséquent, pour correspondre au calcul il vous suffit d'inverser l'ordre et ajouter le sel dernier

 md.update(toHash.getBytes(ENCODING)); 
     byte[] bytes = md.digest(salt.getBytes(ENCODING)); 

Ou encore

 md.update(toHash.getBytes(ENCODING)); 
     md.update(salt.getBytes(ENCODING)); 
     byte[] bytes = md.digest();