Calcul SHA256 Hash sous Android / Java et C#

j'essaie de générer un hash SHA256 dans android, que je passe ensuite à un ASP.NET Web API service web et comparez le hachage là. En tant que tel, je dois construire un hachage dans Android, que compte tenu des mêmes entrées dans ASP.NET générera un hachage équivalent. Je me tire les cheveux en essayant de comprendre ce que je fais de mal.

voici le code Android:

public String computeHash(String input) throws NoSuchAlgorithmException{
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    digest.reset();
    try{
      digest.update(input.getBytes("UTF-8"));
    } catch (UnsupportedEncodingException e){
      e.printStackTrace();
    }

    byte[] byteData = digest.digest(input.getBytes());
    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < byteData.length; i++){
      sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
    }
    return sb.toString();
}

et voici le CODE sur le serveur (c#):

    private static string ComputeHash(string input, HashAlgorithm algorithm)
    {

        Byte[] inputBytes = Encoding.UTF8.GetBytes(input);
        Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < hashedBytes.Length; i++)
        {
            sb.Append(String.Format("{0:x2}", hashedBytes[i]));
        }

        return sb.ToString();
    }

mise à jour: Voici le corrigé Android/Java mise en œuvre (merci Nicolas Elenkov):

public String computeHash(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException{
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    digest.reset();

    byte[] byteData = digest.digest(input.getBytes("UTF-8"));
    StringBuffer sb = new StringBuffer();

    for (int i = 0; i < byteData.length; i++){
      sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
    }
    return sb.toString();
}
33
demandé sur Kevin 2012-03-12 06:23:34

1 réponses

votre code Java est erroné: vous ajoutez les octets d'entrée deux fois. Si vous calculez ceci en une seule fois, vous devez soit appeler seulement digest(bytes) ou appelez digest() après update(bytes);

20
répondu Nikolay Elenkov 2012-03-12 04:35:48