Hashing MD5 di Java

Java Top

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Ikhtisar

MD5 adalah fungsi hash kriptografi yang banyak digunakan, yang menghasilkan hash 128 bit.

Pada artikel ini, kita akan melihat berbagai pendekatan untuk membuat hash MD5 menggunakan berbagai pustaka Java .

2. MD5 Menggunakan Kelas MessageDigest

Ada fungsionalitas hashing di kelas java.security.MessageDigest . Idenya adalah untuk membuat instance MessageDigest terlebih dahulu dengan jenis algoritma yang ingin Anda gunakan sebagai argumen:

MessageDigest.getInstance(String Algorithm)

Dan kemudian terus perbarui intisari pesan menggunakan fungsi update () :

public void update(byte [] input)

Fungsi di atas bisa dipanggil berkali-kali saat Anda membaca file yang panjang. Kemudian terakhir kita perlu menggunakan fungsi digest () untuk menghasilkan kode hash:

public byte[] digest()

Di bawah ini adalah contoh yang menghasilkan hash untuk kata sandi dan kemudian memverifikasinya:

@Test public void givenPassword_whenHashing_thenVerifying() throws NoSuchAlgorithmException { String hash = "35454B055CC325EA1AF2126E27707052"; String password = "ILoveJava"; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(password.getBytes()); byte[] digest = md.digest(); String myHash = DatatypeConverter .printHexBinary(digest).toUpperCase(); assertThat(myHash.equals(hash)).isTrue(); }

Demikian pula, kami juga dapat memverifikasi checksum file:

@Test public void givenFile_generatingChecksum_thenVerifying() throws NoSuchAlgorithmException, IOException { String filename = "src/test/resources/test_md5.txt"; String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; MessageDigest md = MessageDigest.getInstance("MD5"); md.update(Files.readAllBytes(Paths.get(filename))); byte[] digest = md.digest(); String myChecksum = DatatypeConverter .printHexBinary(digest).toUpperCase(); assertThat(myChecksum.equals(checksum)).isTrue(); }

Kita perlu menyadari, bahwa MessageDigest tidak aman untuk thread . Akibatnya, kita harus menggunakan contoh baru untuk setiap utas.

3. MD5 Menggunakan Apache Commons

Kelas org.apache.commons.codec.digest.DigestUtils membuat segalanya lebih sederhana.

Mari kita lihat contoh untuk mencirikan dan memverifikasi kata sandi:

@Test public void givenPassword_whenHashingUsingCommons_thenVerifying() { String hash = "35454B055CC325EA1AF2126E27707052"; String password = "ILoveJava"; String md5Hex = DigestUtils .md5Hex(password).toUpperCase(); assertThat(md5Hex.equals(hash)).isTrue(); }

4. MD5 Menggunakan Jambu Biji

Di bawah ini adalah pendekatan lain yang dapat kita ikuti untuk menghasilkan checksum MD5 menggunakan com.google.common.io.Files.hash :

@Test public void givenFile_whenChecksumUsingGuava_thenVerifying() throws IOException { String filename = "src/test/resources/test_md5.txt"; String checksum = "5EB63BBBE01EEED093CB22BB8F5ACDC3"; HashCode hash = com.google.common.io.Files .hash(new File(filename), Hashing.md5()); String myChecksum = hash.toString() .toUpperCase(); assertThat(myChecksum.equals(checksum)).isTrue(); }

Perhatikan, Hashing.md5 tidak digunakan lagi. Namun, seperti yang ditunjukkan oleh dokumentasi resmi, alasannya adalah untuk menyarankan agar tidak menggunakan MD5 secara umum untuk masalah keamanan. Artinya kita masih bisa menggunakan metode ini jika kita, misalnya, perlu berintegrasi dengan sistem lama yang membutuhkan MD5. Jika tidak, lebih baik kami mempertimbangkan opsi yang lebih aman, seperti SHA-256.

5. Kesimpulan

Ada berbagai cara di Java API dan API pihak ketiga lainnya seperti Apache commons dan Guava untuk menghasilkan hash MD5. Pilih dengan bijak berdasarkan persyaratan proyek dan ketergantungan yang perlu diikuti proyek Anda.

Seperti biasa, kode tersedia di Github.

Jawa bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya