Pesan Intisari (hash) adalah byte [] dalam byte [] keluar
Intisari pesan didefinisikan sebagai fungsi yang mengambil array byte mentah dan mengembalikan array byte mentah (alias byte[]
). Misalnya SHA-1 (Secure Hash Algorithm 1) memiliki ukuran digest 160 bit atau 20 byte. Array byte mentah biasanya tidak dapat diartikan sebagai pengkodean karakter seperti UTF-8 , karena tidak setiap byte dalam setiap order adalah legal yang encoding. Jadi mengubahnya menjadi String
:
new String(md.digest(subject), StandardCharsets.UTF_8)
mungkin membuat beberapa urutan ilegal atau memiliki penunjuk kode ke pemetaan Unicode yang tidak terdefinisi :
[�a�ɹ??�%l�3~��.
Encoding biner-ke-teks
Untuk itu digunakan pengkodean biner-ke-teks . Dengan hash, yang paling banyak digunakan adalah penyandian HEX atau Base16 . Pada dasarnya satu byte dapat memiliki nilai dari 0
ke 255
(atau -128
ke 127
ditandatangani) yang setara dengan representasi HEX dari 0x00
- 0xFF
. Oleh karena itu hex akan menggandakan panjang output yang diperlukan, itu berarti output 20 byte akan membuat string hex panjang 40 karakter, misalnya:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Perhatikan bahwa tidak perlu menggunakan pengkodean hex. Anda juga bisa menggunakan sesuatu seperti base64 . Hex sering disukai karena lebih mudah dibaca oleh manusia dan memiliki panjang keluaran yang ditentukan tanpa perlu bantalan.
Anda dapat mengonversi array byte ke hex dengan fungsi JDK saja:
new BigInteger(1, token).toString(16)
Namun perlu dicatat bahwa BigInteger
akan menafsirkan array byte yang diberikan sebagai angka dan bukan sebagai string byte. Itu berarti nol di depan tidak akan dikeluarkan dan string yang dihasilkan mungkin lebih pendek dari 40 karakter.
Menggunakan Perpustakaan untuk Menyandikan ke HEX
Anda sekarang dapat menyalin dan menempelkan metode byte-to-hex yang belum diuji dari Stack Overflow atau menggunakan dependensi besar seperti Guava .
Untuk memiliki solusi masuk untuk sebagian besar masalah terkait byte, saya menerapkan utilitas untuk menangani kasus ini: bytes-java (Github)
Untuk mengonversi array byte intisikan pesan Anda, Anda cukup melakukannya
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
atau Anda bisa menggunakan fitur hash bawaan
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
tanpa tanda hubung, tidak tahu apakah itu akan membuat perbedaan.