Pertanyaan Hitung SHA256 Hash di Android / Java dan C #


Saya mencoba untuk menghasilkan hash SHA256 di Android, yang kemudian saya berikan ke layanan web ASP.NET Web API dan membandingkan hash di sana. Dengan demikian, saya perlu membangun hash di Android, yang diberikan masukan yang sama di ASP.NET akan menghasilkan hash yang setara. Saya menarik rambut saya keluar mencoba untuk mencari tahu apa yang saya lakukan salah.

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

DAN DI SINI KODE DI ATAS SERVER (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();
    }

MEMPERBARUI:  Berikut adalah implementasi Android / Java yang dikoreksi (terima kasih Nikolay 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();
}

32
2018-03-12 02:23


asal


Jawaban:


Kode Java Anda salah: Anda menambahkan byte input dua kali. Jika Anda menghitung ini sekaligus, Anda harus menelepon saja digest(bytes) atau telepon digest() setelah update(bytes);


20
2018-03-12 04:35