Подтвердить что ты не робот

Вычислить SHA256 Hash в Android/Java и С#

Я пытаюсь создать хэш 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();
}

И ЗДЕСЬ КОД НА СЕРВЕРЕ (С#):

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

Ответ 1

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