08 Januari 2018
Message Authentication Code dengan Java

Tutorial kali ini membahas tentang implementasi Message Authentication Code (MAC) dalam pemrograman java. MAC pada intinya adalah informasi yang digunakan untuk memastikan bahwa pesan betul-betul berasal dari sumber yang disebutkan dan tidak mengalami perubahan sejak dikirim dari sumber tersebut. MAC dibangkitkan (di-generate) dari kombinasi pesan dan kunci menggunakan suatu algoritma.

Java Development Kit menyediakan support untuk pembangkitan MAC menggunakan beragam algoritma melalui class javax.crypto.Mac. Selain class tersebut, kita juga akan menggunakan class javax.crypto.spec.SecretKeySpec dan java.util.Base64.

Contoh Program

Kita mulai dengan membuat fungsi statik getMac() yang akan menerima 3 parameter String pesan, kunci, dan algo. Dalam parameter algo kita sebutkan algoritma MAC yang akan digunakan.

public static String getMac(String pesan, String kunci, String algo) throws Exception {
  // kode berikutnya ditulis disini
}

Yang dibutuhkan pertama adalah objek SecretKeySpec1 dari parameter kunci disesuaikan dengan algoritma (parameter algo) yang akan digunakan.

SecretKeySpec keySpec = new SecretKeySpec(kunci.getBytes(), algo);

Berikutnya kita bentuk objek Mac menggunakan metode statik getInstance()2. Dalam pemanggilannya kita sebutkan algoritma yang akan digunakan (parameter algo).

Mac mac = Mac.getInstance(algo);

Selanjutnya kita lakukan inisialisasi objek menggunakan metode init()3 menggunakan objek keySpec yang sudah dibuat sebelumnya.

mac.init(keySpec);

Dari sini kita bisa dapatkan MAC dalam bentuk array byte dari pesan menggunakan metode doFinal()4. Metode ini menggunakan satu parameter yaitu array byte dari pesan.

byte[] bMac = mac.doFinal(pesan.getBytes());

Selebihnya kita bisa dapatkan bentuk Base64 String dari array byte bMac dengan menggunakan kode berikut :

byte[] b64Mac = Base64.getEncoder().encode(bMac);
return new String(b64Mac);

Kode selengkapnya adalah sebagai berikut :

private static String getMac(String pesan, String kunci, String algo) throws Exception {
  SecretKeySpec keySpec = new SecretKeySpec(kunci.getBytes(), algo);
  Mac mac = Mac.getInstance(algo);
  mac.init(keySpec);
  byte[] bMac = mac.doFinal(pesan.getBytes());
  byte[] b64Mac = Base64.getEncoder().encode(bMac);
  return new String(b64Mac);
}

Penggunaan

Yang perlu diperhatikan dari fungsi diatas adalah nama algoritma MAC yang ingin digunakan. Di halaman ini disebutkan nama-nama algoritma yang bisa digunakan. Selain dari nama-nama tersebut, fungsi ini akan menghasilkan eksepsi. Contoh penggunaan fungsi getMac() adalah sebagai berikut :

String pesan = "Saya belajar kriptografi";
String kunci = "h4x3r_d00d";
try {
  String strMac = getMac(pesan, kunci, "HmacMD5");
  System.out.println(strMac);
}
catch(Exception exc) {
  System.err.println(exc.toString());
}

Kode diatas akan menghasilkan String MAC berikut :

3mnc08ZyPa+TmwEwD0ps3A==

Sedikit perubahan pada pesan atau kunci akan mengubah MAC secara keseluruhan, sebagai contoh jika nilai dari pesan adalah "saya belajar kriptografi" (perhatikan huruf "s" kecil), MAC yang akan dihasilkan adalah :

kmIx7UcnT7JRRG9zx8aSRw==