38 votes

Calculer le hachage SHA256 dans Android / Java et C #

Je suis en train de générer un hachage SHA256 dans android, que j'ai ensuite passer à une ASP.NET l'API Web service web et de comparer le hash là. En tant que tel, j'ai besoin de construire une table de hachage dans Android, qui a donné les mêmes entrées dans ASP.NET va générer un équivalent de hachage. Je suis en tirant mes cheveux à essayer de comprendre ce que je fais 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();
}

21voto

Nikolay Elenkov Points 32843

Votre code Java est incorrect: vous ajoutez deux fois les octets d'entrée. Si vous calculez cela en une seule fois, vous devez appeler uniquement digest(bytes) ou appeler digest() après update(bytes) ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X