Вычислить хэш SHA256 в Android / Java и C # - PullRequest
34 голосов
/ 12 марта 2012

Я пытаюсь сгенерировать хэш SHA256 в Android, который затем перехожу к веб-службе ASP.NET Web API и сравниваю хеш. Поэтому мне нужно создать хеш в Android, который при тех же входных данных в ASP.NET будет генерировать эквивалентный хеш. Я дергаю себя за волосы, пытаясь понять, что я делаю неправильно.

Вот код 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();
}

И ЗДЕСЬ КОД НА СЕРВЕРЕ (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();
    }

UPDATE: Вот исправленная реализация Android / Java (спасибо Николай Еленков):

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();
}

1 Ответ

21 голосов
/ 12 марта 2012

Ваш код Java неверен: вы добавляете входные байты дважды. Если вы рассчитываете это за один раз, вам нужно либо позвонить только digest(bytes) или позвонить digest() после update(bytes);

...