0Pricing
Java Academy · Pelajaran

Hash Kriptografis dengan MessageDigest

Hash kata sandi dengan SHA-256, tambahkan salt untuk mencegah serangan rainbow table, dan bandingkan digest secara aman.

Hash Kriptografis dengan MessageDigest adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

Apa Itu Hashing Kriptografis

Fungsi hash kriptografis memetakan data dengan ukuran apa pun menjadi digest berukuran tetap. Fungsi ini satu arah (tidak dapat dibalik), deterministik, dan tahan terhadap tabrakan. Hashing digunakan untuk penyimpanan kata sandi, integritas data, dan tanda tangan digital.

API MessageDigest

MessageDigest.getInstance("SHA-256") mengembalikan pengolah hash SHA-256. Panggil digest(bytes) untuk menghitung hash dan mendapatkan array byte.

MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hash = md.digest("password123".getBytes(StandardCharsets.UTF_8));
String hex = HexFormat.of().formatHex(hash);
System.out.println(hex); // 64-char hex string

Algoritme Umum

JDK mendukung: MD5 (sudah tidak aman — jangan pernah digunakan untuk keamanan), SHA-1 (tidak lagi direkomendasikan untuk keamanan), SHA-256 (standar), SHA-512 (lebih kuat), SHA3-256 (modern). Selalu gunakan SHA-256 atau SHA-512 untuk kode baru.

MessageDigest.getInstance("SHA-256");  // recommended
MessageDigest.getInstance("SHA-512");  // stronger
MessageDigest.getInstance("SHA3-256"); // SHA-3 family
// Never: MessageDigest.getInstance("MD5"); // cryptographically broken

Mengubah Hash Menjadi String Heksadesimal

Hasil array byte harus diubah menjadi string heksadesimal untuk disimpan atau dibandingkan. Gunakan HexFormat (Java 17+) atau String.format untuk versi yang lebih lama.

// Java 17+:
String hex = HexFormat.of().formatHex(hash);
// Older Java:
StringBuilder sb = new StringBuilder();
for (byte b : hash) sb.append(String.format("%02x", b));
String hex = sb.toString();

Salt: Mengalahkan Rainbow Table

Rainbow table memetakan kata sandi umum ke hash-nya. Penambahan salt menambahkan nilai acak ke setiap kata sandi sebelum hashing, sehingga rainbow table tidak berguna. Simpan salt bersama hash.

SecureRandom random = new SecureRandom();
byte[] salt = new byte[16];
random.nextBytes(salt);
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(salt);
byte[] hash = md.digest("password".getBytes(StandardCharsets.UTF_8));
// Store: Base64.encode(salt) + ":" + Base64.encode(hash)

Hashing Kata Sandi — Gunakan BCrypt

SHA-256 dengan salt lebih baik daripada SHA-256 biasa, tetapi masih terlalu cepat — penyerang dapat mencoba miliaran tebakan per detik. Gunakan KDF yang lambat: BCryptPasswordEncoder (Spring Security), atau PBKDF2 maupun Argon2 untuk kata sandi.

// Spring Security — proper password hashing:
PasswordEncoder encoder = new BCryptPasswordEncoder(12); // cost factor 12
String hash = encoder.encode("password123");
boolean match = encoder.matches("password123", hash); // true

Pemeriksaan Integritas Berkas

Hash sebuah berkas untuk mendeteksi kerusakan atau manipulasi. Bandingkan hash yang dihitung dengan referensi yang diketahui baik.

MessageDigest md = MessageDigest.getInstance("SHA-256");
try (InputStream is = Files.newInputStream(Path.of("app.jar"))) {
    byte[] buf = new byte[8192];
    int n;
    while ((n = is.read(buf)) > 0) md.update(buf, 0, n);
}
String hash = HexFormat.of().formatHex(md.digest());
System.out.println("SHA-256: " + hash);

Membandingkan Hash dengan Aman

Gunakan MessageDigest.isEqual() untuk perbandingan dengan waktu konstan guna mencegah serangan waktu. Jangan pernah menggunakan String.equals() untuk membandingkan hash.

byte[] expected = computeHash(storedHash);
byte[] actual   = computeHash(inputPassword);
boolean match = MessageDigest.isEqual(expected, actual); // constant-time

Memperbarui Secara Berantai

Panggil md.update(bytes) beberapa kali sebelum md.digest() untuk melakukan hashing pada data yang tiba dalam beberapa bagian (aliran data).

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update("part1".getBytes());
md.update("part2".getBytes());
byte[] hash = md.digest(); // hash of "part1" + "part2"

Mengodekan Hash untuk Penyimpanan

Simpan hash biner sebagai Base64 (lebih pendek daripada heksadesimal) atau string heksadesimal. Base64 menggunakan 43 karakter untuk SHA-256, sedangkan heksadesimal menggunakan 64 karakter. Keduanya benar — gunakan secara konsisten.

byte[] hash = md.digest(data);
String base64 = Base64.getEncoder().encodeToString(hash); // 44 chars (with padding)
String hex    = HexFormat.of().formatHex(hash);           // 64 chars

DigestInputStream untuk Aliran Data

Bungkus InputStream dengan DigestInputStream untuk menghitung hash saat membaca — cara ini menghindari pemuatan seluruh berkas ke memori.

MessageDigest md = MessageDigest.getInstance("SHA-256");
try (DigestInputStream dis = new DigestInputStream(Files.newInputStream(path), md)) {
    dis.transferTo(OutputStream.nullOutputStream());
}
String hash = HexFormat.of().formatHex(md.digest());

Pemeriksaan Cepat

Mengapa SHA-256 dengan salt tetap tidak direkomendasikan untuk penyimpanan kata sandi?

Ringkasan

Gunakan MessageDigest.getInstance("SHA-256") untuk memeriksa integritas data. Selalu tambahkan salt pada kata sandi — tetapi gunakan BCrypt/Argon2 untuk penyimpanan kata sandi, bukan SHA mentah. Gunakan perbandingan dengan waktu konstan (MessageDigest.isEqual) untuk mencegah serangan waktu.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Hash Kriptografis dengan MessageDigest” gratis?

Ya — teks lengkap “Hash Kriptografis dengan MessageDigest” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Hash Kriptografis dengan MessageDigest”?

Hash kata sandi dengan SHA-256, tambahkan salt untuk mencegah serangan rainbow table, dan bandingkan digest secara aman. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Hash Kriptografis dengan MessageDigest” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Hash Kriptografis dengan MessageDigest
  2. Enkripsi Simetris AES
  3. HMAC-SHA256 untuk Integritas Pesan
  4. JWT: Struktur, Pembuatan, dan Verifikasi
← Kembali ke Java Academy