Menambah Fitur Dekripsi JSON pada Gembok Authenticator

1 min read

Disclaimer
Saya bekerja di AWS, semua opini adalah dari saya pribadi. (I work for AWS, my opinions are my own.)
Gembok Authenticator Javascript OTP Generator
Gembok Authenticator v1.2 – Dekripsi JSON

TeknoCerdas.com – Salam cerdas untuk kita semua. Gembok Authenticator adalah 2FA Token Generator alternatif dari Google Authenticator yang ditulis menggunakan HTML dan Javascript. Kekurangan pada versi 1.1 adalah file konfigurasi JSON harus berupa plain text. Sehingga secara default ini kurang aman. Pada tulisan ini kita akan melihat bagaimana fitur keamanan ditambahkan yaitu Gembok Authenticator v1.2 dapat membaca file JSON yang dienkripsi dengan AES-256-CBC.

Memang pengguna bisa melakukan enkripsi dan dekripsi sendiri secara manual sebelum file JSON dibuka dengan Gembok Authenticator. Namun cara ini menjadi kurang praktis jika dilakukan berulang-ulang.

Untuk itu pada Gembok Authenticator v1.2 file JSON yang dienkripsi dengan AES-256-CBC secara default dapat didekripsi oleh Gembok Authenticator tanpa anda perlu melakukannya secara manual diluar Gembok Authenticator.

Baca Juga
Menambah Fitur Copy to Clipboard pada Gembok Authenticator

Perlu diingat bahwa, pada Gembok Authenticator tidak menyediakan fitur enkripsi. Sehingga enkripsi file JSON harus dilakukan sendiri diluar aplikasi. Misal dengan menggunakan OpenSSL.

Kenapa memilih AES-256-CBC

Karena The Advanced Encryption Standard (AES) dengan panjang kunci 256-bits adalah salah satu metode simetris enkripsi yang unggul dan banyak digunakan. Hanya memerlukan satu kunci (passpharase) untuk melakukan enkripsi dan deskripsi.

Sedangkan mode yang digunakan adalah Cipher Block Chaining (CBC). Jujur saja saya tidak begitu memahami masalah enkripsi. Alasan utama yang lain kenapa AES-256-CBC digunakan adalah pada modul crypto-js ketika sebuah key atau passphrase digunakan maka mode 256-CBC pada AES akan digunakan.

Tulisan bagus tentang mode pada AES dapat dilihat di https://www.highgo.ca/2019/08/08/the-difference-in-five-modes-in-the-aes-encryption-algorithm/

Perubahan kode yang dilakukan

Pertama adalah menambahkan modul baru yaitu crypto-js dan meletakkannya pada direktori src/libs. Modul ini akan digunakan untuk melakukan dekripsi konfigurasi JSON file yang dienkripsi menggunakan AES-256-CBC.

Perubahan paling utama pada index.html adalah bagaimana proses membaca file JSON dilakukan. Jika sebelumnya langsung menggunakan JSON.parse seperti ditunjukkan dibawah ini.

function loadItems(jsonData) {
  try {
    var items = JSON.parse(jsonData);
    ...

Maka pada Gembok Authenticator versi 1.2 sebelum variabel jsonData tersebut diproses maka akan coba dideteksi dulu jika ini adalah file JSON terenkripsi maka akan coba didekrip terlebih dahulu. Untuk itu diperkenalkan fungsi baru yaitu parseEncryptedJson.

function parseEncryptedJson(jsonData) {
  jsonData = jsonData.trim();
  if (jsonData.charAt(0) === '[') {
    return jsonData;
  }

  // It should be encrypted JSON with AES
  var password = prompt('Enter passphrase');
  if (password === null) {
    throw 'Can not decrypt file, invalid passphrase.';
  }

  return CryptoJS.AES.decrypt(jsonData, password).toString(CryptoJS.enc.Utf8);
}

function loadItems(jsonData) {
  try {
    var items = JSON.parse(parseEncryptedJson(jsonData));
    ...

Fungis parseEncryptedJson sebetulnya sangat sederhana, dimana ia hanya coba mendeteksi jika karakter pertama bukan [ berarti ini diasumsikan encrypted JSON dengan AES-256-CBC. Sehingga modul crypto-js digunakan untuk melakukan dekripsi.

Perubahan kode secara detil pada fungsi diatas bisa dilihat pada commit a8661381a81b.

Jika memang enkripsi yang digunakan bukanlah AES-256-CBC atau passphrase salah maka Gembok Authenticator tidak akan bisa melakukan dekripsi dan konfigurasi tidak dapat dibaca. Maka pengguna yang harus melakukan dekripsi secara mandiri sebelum meload file JSON ke Gembok Auhtenticator.

Dengan perubahan kecil ini diharapkan Gembok Authenticator semakin aman dan mudah digunakan.