MD5 Hashing di Java

Java Teratas

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

>> SEMAK KURSUS

1. Gambaran keseluruhan

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

Dalam artikel ini, kita akan melihat pendekatan yang berbeza untuk membuat hash MD5 menggunakan pelbagai perpustakaan Java .

2. MD5 Menggunakan Kelas MessageDigest

Terdapat fungsi hashing dalam kelas java.security.MessageDigest . Ideanya adalah untuk pertama kali membuat MessageDigest dengan jenis algoritma yang ingin anda gunakan sebagai argumen:

MessageDigest.getInstance(String Algorithm)

Dan teruskan mengemas kini ringkasan mesej menggunakan fungsi update () :

public void update(byte [] input)

Fungsi di atas boleh dipanggil berkali-kali apabila anda membaca fail panjang. Akhirnya kita perlu menggunakan fungsi digest () untuk menghasilkan kod hash:

public byte[] digest()

Berikut adalah contoh yang menghasilkan hash untuk kata laluan dan kemudian mengesahkannya:

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

Begitu juga, kita juga dapat mengesahkan checksum fail:

@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 sedar, bahawa MessageDigest tidak selamat di dalam benang . Oleh itu, kita harus menggunakan contoh baru untuk setiap utas.

3. MD5 Menggunakan Apache Commons

The org.apache.commons.codec.digest.DigestUtils kelas membuat perkara yang lebih mudah.

Mari lihat contoh hashing dan pengesahan kata laluan:

@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 Batu

Berikut adalah pendekatan lain yang boleh 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, bahawa Hashing.md5 sudah tidak digunakan lagi. Namun, seperti yang ditunjukkan oleh dokumentasi rasmi, alasannya adalah untuk memberi nasihat untuk tidak menggunakan MD5 secara umum untuk masalah keselamatan. Ini bermakna kita masih boleh menggunakan kaedah ini jika kita, misalnya, perlu berintegrasi dengan sistem warisan yang memerlukan MD5. Jika tidak, lebih baik kita mempertimbangkan pilihan yang lebih selamat, seperti SHA-256.

5. Kesimpulan

Terdapat cara yang berbeza dalam API Java dan API pihak ketiga lain seperti Apache commons dan Guava untuk menghasilkan hash MD5. Pilih dengan bijak berdasarkan kehendak projek dan kebergantungan yang perlu dipatuhi oleh projek anda.

Seperti biasa, kodnya terdapat di Github.

Bahagian bawah Java

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

>> SEMAK KURSUS