Membedah e-KTP

Posting ini sekedar membahas tentang kartu tanda penduduk elektronik (e-KTP). Sampai saat ini saya belum pulang ke Indonesia untuk mengurus e-KTP karena KTP lama masih berlaku. Waktu orang tua saya datang ke sini tahun lalu saya sudah sempat ngoprek e-KTP mereka sedikit, dan sekarang selagi mereka berkunjung saya teruskan dan tuliskan hasil eksplorasi saya.

Sebagian isi tulisan ini didapat dari reverse engineering, dan sebagian lagi dari berbagai informasi yang tersebar di Internet. Ada juga bagian yang merupakan spekulasi saya dari informasi yang ada.

Security sebuah smart card

Sebuah smart card adalah sebuah komputer kecil, di dalamnya ada CPU, RAM, dan juga storage. Smart card diakses menggunakan reader, secara umum ada dua jenis: contact (menggunakan konektor fisik seperti SIM card) dan contactless (tanpa konektor fisik seperti kartu e-Money berbagai bank saat ini). Dari sisi programming keduanya sama saja. Kartu smart card yang baru umumnya juga sudah tahan (immune) terhadap side channel attack (DPA/SPA/FI dsb).

Hal yang membuat smart card penting untuk security adalah kemampuan smart card untuk melakukan komputasi (menghitung, melakukan hasing, enkripsi, dekripsi, dsb), dan sangat sulit untuk melakukan ekstraksi data dari smart card. Bayangkan seperti disuruh mengekstrak data di sebuah komputer yang dicor dan dimasukkan ke lemari besi.

Dari segi security, kita bisa memandang smart card ini seperti komputer remote yang melakukan komputasi yang tidak kita ketahui, dan kita tidak bisa mengekstrak informasi jika tidak ada bug pada implementasinya. Bayangkan sebuah sevice php seperti ini

<?php echo hash_hmac (“sha256”, $_GET[“q”], “[email protected]!ku” );?>

Jika kita tidak memiliki akses ke source code program tersebut, maka kita bisa mencoba-coba berbagai input, dan dengan melihat outputnya kita tidak akan bisa mengetahui bahwa kita memakai key “[email protected]!ku”.

Untuk berkomunikasi dengan smart card, kita mengirimkan perintah dalam bentuk byte-byte (dinamakan PDU atau protocol data unit), dan dibalas oleh card dengan status dan byte-byte hasil. Sebenarnya ini tidak berbeda jauh dari komunikasi lain seperti HTTP: kita mengirimkan request, dan card akan mengirimkan status dan balasan. Bahkan smart card generasi baru memang memasukkan server HTTP di dalamnya.

Riset smart card di level protokol (bukan level serangan fisik) bisa dilakukan dengan biaya relatif rendah. Card reader jenis contact dengan konektor USB bisa didapatkan dengan dengan harga kurang dari 10 USD, dan versi contactless (NFC) dengan konektor USB harganya sekitar 30 USD (atau jika punya Raspberry Pi atau Arduino, harga modul NFC-nya saja bisa kurang dari 5 USD).

Perhatikan bahwa: sebuah smart card bisa diisi program. Programnya bisa melakukan apa saja, baik itu memenuhi standar tertentu, atau melakukan sesuatu yang sifatnya custom. Sebagai informasi, kebanyakan  (tapi tidak semua) card sekarang ini diprogram menggunakan Java (teknologi JavaCard). Eksperimen Java Card bisa dilakukan di PC tanpa kartu menggunakan JCardSim.

Smart card juga memiliki protokol standar untuk filesystem. Kita bisa memilih Master File/Dedicated File (MF/DF) yang merupakan struktur direktori, dan EF (Elementary File) yang merupakan file. Semua “nama” pada file hanyalah bilangan yang umumnya dituliskan dalam notasi heksa desimal. Sebuah MF/DF/EF bisa diproteksi dan hanya bisa diakses dalam kondisi tertentu saja (dalam kondisi lain statusnya access denied)

SAM (Secure Access Module/Secure Application Module)

Jika komputer biasa digunakan untuk melakukan komputasi kriptopgrafi untuk dimasukkan ke e-KTP maka programnya akan rawan sekali diubah dan keynya gampang dicuri. Untuk mengatasi hal ini digunakan smart card lain yang dinamakan SAM. Ini hanya merupakan nama peran/role untuk smart card. Sebuah smart card biasa bisa menjadi SAM. Jadi sebuah SAM juga bisa diberi program apa saja. SAM ini bisa berupa chip yang ditanam di hardware, atau berupa kartu biasa. Biasanya SAM ini akan menggunakan jenis kartu contact.

Sekarang masalah security berpindah ke SAM. Tentunya SAM ini berbahaya jika jatuh ke tangan yang salah, jadi ada mekanisme keamanan yang diterapkan pada SAM e-KTP. Mekanismenya cukup sederhana, sehingga jika cukup niat bisa diakali. Ketika Kartu SAM diberikan untuk dipakai dengan aplikasi di sebuah komputer, file konfigurasi diberikan. File konfigurasi ini dienkrip dengan “Machine ID” (yang bisa dengan mudah didapatkan oleh program apapun).

Dengan menggunaakan file konfigurasi yang di XOR dengan machine ID, didapatkan key untuk mengakses Kartu SAM. Kartu tidak bisa dengan mudah dipakai di komputer lain tanpa mengakali program dan/atau mengganti machine ID. Jika N kali salah memasukkan machine ID, maka kartu SAM akan terblokir, dan harus meminta kartu SAM baru.

Keamanan ini hanya sekedar menghindari SAM yang “tercecer” di jalan agar tidak bisa sembarang dipakai. Jika ada yang berniat mengambil kartu SAM dan tahu dipakai di komputer mana (atau device mana), maka keamanan ini tidak membantu. Jadi bisa saja seoarang operator meminjam kartu SAM, dibawa pulang dan dipakai di rumah.

Data Pada e-KTP

Data yang disimpan pada e-KTP pada MF/DF 7F0A. Untuk memilih MF/DF ini bisa digunakan PDU

00A40000027F0A

Beberapa data yang ada di kartu:

  1. Data kontrol kartu (Card Control, pada EF: 6FF0), terbuka tapi spesifikasinya tidak diketahui
  2. Foto (EF: 6FF2), data ini terbuka
  3. Data Demografik/Biodata (6FF1), datanya diproteksi
  4. Data sidik jari: Minutiae1 (6FF4) dan Minutiae2 (6FF5), datanya diproteksi
  5. Scan tanda tangan (6FF3), datanya diproteksi
  6. ECDSA Signature (6FF6), datanya diproteksi

Mengekstrak Foto dari e-KTP

Foto dapat diekstrak dari e-KTP karena memang tidak diproteksi. Cara membacanya cukup mudah, pertama pilih MF/DF dan EF foto, lalu baca 2 byte pertama

00A40000027F0A
00A40000026FF2
00B0000002

Pada 2 byte pertama terdapat panjang (ukuran) data JPEG yang perlu dibaca.  Perhatikan bahwa apapun perintahnya akan selalu ada 2 byte status kembalian (9000 artinya adalah OK, bisa dibandingkan dengan HTTP Code 200):

=> 00 a4 00 00 02 7f 0a
<= 90 00 
Response : 
=> 00 a4 00 00 02 6f f2
<= 90 00 
Response : 
=> 00 b0 00 00 02
<= 06 fe 90 00
Response : 06 fe

Dalam kasus ini panjang file adalah 0x6fe byte = 1790 byte.

Berikutnya data bisa dibaca dengan mengirimkan PDU berikut ini berulang sampai selesai terbaca. Misalnya kita membaca dari offset 2 sebanyak 16 byte, berikutnya dari offset 18 sebanyak 16 byte, dst.

00BB<Offset High><Offset Low><Size>

Jika kita memiliki offset: 0x1234, maka Offset High adalah 0x12 dan Offset Low 0x34.  Teorinya kita bisa membaca sampai 255 byte sekali baca, kenyataannya card readernya bisa error. Di aplikasi e-KTP digunakan 112 byte sekali baca tapi di salah satu card reader saya, saya perlu memakai ukuran 16 byte sekali baca supaya reliable.

Data yang didapatkan adalah file JPEG biasa dengan ukuran 96×96 piksel.


Autentikasi Kartu

Untuk membaca data yang diproteksi, diperlukan key yang berada di SAM. Langkah pertama adalah mutual authentication untuk mendapatkan session key. Berdasarkan hasil reverse engineering,  protokol ini sepertinya berdasarkan Doc 9303 ICAO (Machine Readable Travel Documents) terutama Part 11 (Security Mechanisms for MRTDs).

Di dalam dokumen di atas, diasumsikan mesin pembaca memiliki key dalam memori komputer. Dalam dokumen itu protokolnya seperti ini (hanya garis besar, lihat contoh Appendix D di dokumen 9303 Part 11). Masing-masing pihak (kartu dan app desktop) memiliki SEED yang menjadi dasar untuk pembuatan key:

  • To Card: 0084000008 (request challenge/random number)
  • From Card: 8 byte random
  • From App: Generate random X1 (8 byte) dan X2 (16 byte), lalu  hoitung P1 = 3DES(X1 + RandomFrom Card +X2) , P2 = MAC(P1), hasilnya P1 + P2 ukurannya 40 byte, kirimkan ini ke kartu
  • From Card: kartu melakukan perhitungan serupa dan mengembalikan 40 byte
  • App melakukan komputasi dan menghasilkan session key.

Sedangkan protokolnya e-KTP seperti ini:

  • To SAM: Reset 00FF000000
  • From SAM: OK
  • To CARD: Get Challenge: 0084000008
  • From Card: challenge (8 byte)
  • To SAM: GenerateMutualAuth 00F10000 + CardControl + UID (8) + Challenge (8)
  • From SAM: 40 byte
  • To Card: ExternalAuth: 0082000028 + response from SAM
  • From Card: 40 byte
  • To SAM: VerifyMutualAuth: 00F2000028 + Response From Card

Perbedaannya adalah ada data Card Control dan UID kartu yang dikirim ke SAM. Sepertinya Card Control ini berisi informasi untuk pembuatan SEED, tapi tanpa source code ini tidak bisa diketahui detailnya.

Akan sangat panjang untuk membuktikan bahwa ini aman, tapi pada dasarnya: jika kita tidak punya key enkripsinya, meskipun kita bisa mengubah apapun di sisi app, maka kita tidak bisa mencari tahu key-nya.

Secure Messaging

Berdasarkan pada session key yang didapat pada proses autentikasi, maka setiap PDU yang dikirim akan dienkrip  dulu sebelum dikirim ke kartu dan yang diterima akan didekrip dulu sebelum diproses. Deskripsi ini cukup panjang, tapi ada gambar di dokumen yang menjelaskan ini.

Karena session key tidak pernah di simpan di PC, tapi di SAM, maka secara praktis yang terjadi adalah:

  1. Aplikasi membuat PDU unprotected (misalnya select EF)
  2. Aplikasi mengirimkan PDU unprotected ke SAM
  3. SAM membalas dengan PDU versi Secure Messaging
  4. Aplikasi mengirimkan PDU terenkripsi ke kartu e-KTP
  5. Kartu e-KTP membalas dalam PDU yang terenkrip
  6. Aplikasi mengirimkan PDU terenkrip dari e-KTP ke SAM
  7. SAM akan mendekrip PDU dan hasilnya dibaca oleh aplikasi di PC

Jadi dalam proses ini, meskipun kita mengetahui data terenkripsi dan hasil dekripsinya, kita tetap tidak tahu key yang digunakan (session ini selalu random dalam setiap koneksi).

Emulasi SAM dan e-KTP

Untuk membuat aplikasi e-KTP tanpa memiliki SAM. kita bisa menggunakan SAM dan e-KTP buatan kita sendiri dengan key yang kita masukkan sendiri tentunya ini tidak akan jalan di e-KTP “beneran” sampai kita memiliki akses untuk SAM yang benar. Hal ini sudah pernah diimplementasikan oleh BPPT dalam paper PERANCANGAN EMULATOR KTP ELEKTRONIK BERBASIS JAVA CARD UNTUK MENDUKUNG PENGUJIAN FUNGSIONALITAS PEMBACA KTP ELEKTRONIK INDUSTRI NASIONAL.

Dalam paper ini disebutkan bahwa metode key derivation yang digunakan e-KTP sifatnya rahasia dan mereka mengimplementasikan sendiri algoritma yang sekedar bisa dipakai oleh kartu SAM dan kartu KTP mereka sendiri.

Amankah e-KTP

Aman tergantung dari sudut pandang mana: dari pembuatan KTP, dan dari pemilik/pengguna KTP. Keamanan e-KTP ada pada SAM-nya.  Ini berarti beberapa hal:

  • Kartu SAM harus dijaga ketat, karena jika bisa dipinjam, maka bisa digunakan membuat KTP Aspal
  • Semoga key generation-nya aman. Saya sudah pernah menemukan kode SAM yang aman, tapi cara membuat key yang random hanya mengandalkan fungsi random biasa (bukan secure random) dan menggunakan seed waktu saat ini.
  • Semoga key utama disimpan dengan baik oleh kemendagri

Saat ini data foto sama sekali tidak diproteksi, sehingga seseorang bisa mengambil foto dari dompet yang tertutup. Menurut standar security MRTD, seharusnya data yang bisa dibaca dienkrip dengan informasi yang tertera di kartu. Misalnya untuk paspor, dari nomor paspor, tanggal lahir, tanggal kadaluarsa. Informasi ini tertera di kartu, jadi seseorang yang berusaha membaca dokumen tidak bisa membaca jika memang tidak memegang kartunya. Dengan ini kita bisa memastikan apakah benar isi data elektronik sama dengan data yang dicetak.

Sempat ada aplikasi POC reader e-KTP tapi sayangnya sudah dihapus dari Google Play (tapi masih bisa didownload dari sini). Aplikasi ini membaca data foto seperti saya jelaskan di atas. Sebenarnya agak berbahaya mempercayai data ini, karena mudah sekali membuat card yang jika dibaca dengan aplikasi tersebut akan keluar foto.

Semoga programmernya handal dan tidak membuat kesalahan implementasi. Saya agak khawatir membaca kode seperti ini di salah satu aplikasi yang saya dekompilasi.

Dari mana bisa tahu ini semua?

Pertama adalah mencari dulu aplikasi desktop e-ktp. Ini bisa dicari dengan query berikut di Google.

“index of” e-ktp inurl:.go.id/

Sekarang sepertinya sudah cukup sadar sehingga installernya lebih sulit dicari, tapi tahun lalu ini mudah sekali dicari. Programnya ditulis dalam .NET tanpa obfuscation sehingga mudah dibuka.

Berikutnya eksperimen diteruskan dengan e-KTP orang tua saya. Saya sudah mencoba beberapa attack yang umum, dan sepertinya semuanya aman.

Saat ini saya baru menemukan hal-hal kecil yang undocumented. Seperti halnya web server yang bisa dicari direktori tersembunyi dengan teknik “forced browsing”, kita bisa mengirimkan perintah berurutan ke smart card untuk mencari tahu perintah mana yang menghasilkan sesuatu tapi tidak terdokumentasi.

Demikian hasil oprekan e-KTP untuk saat ini. Mungkin di masa depan akan saya teruskan lagi. Saat ini belum ada ide serangan baru.

 

Lulusan Kuliah IT seharusnya bisa apa?

Tahun lalu saya membaca mengenai skill yang seharusnya dimiliki lulusan SMK. Entah kenapa tulisan ini beredar lagi di timeline saya tahun ini. Ketika saya baca lagi mengenai skill yang diharapkan, kebanyakan skill ini bahkan tidak dimiliki oleh lulusan Sarjana Informatika/Ilmu Komputer/Teknologi Informasi (berikutnya akan saya singkat jadi: lulusan/sarjana IT).

Sudah menjadi fakta bahwa banyak lulusan IT yang tidak bisa memprogram (silakan baca artikel: Why can’t programmers.. program?). Separah ini:

Like me, the author is having trouble with the fact that 199 out of 200 applicants for every programming job can’t write code at all. I repeat: they can’t write any code whatsoever.

Sebelum diskusi masuk ke masalah pekerjaan, kesuksesan, jiwa entrepreneur, dsb saya ingin menekankan dulu: lulusan apapun dengan skill bagaimanapun bisa bekerja di berbagai bidang yang tidak sesuai jurusan yang diambilnya. Tapi jika sebuah negara ingin bisa maju di bidang tertentu, ya tentunya yang diharapkan adalah lulusan dari bidang tersebut memiliki skill yang baik dan berkontribusi di bidangnya.

Contohnya sebagian orang menyatakan: nggak apa-apa nggak bisa mrogram setelah lulus IT, yang penting kemampuan logikanya terpakai nanti ketika jadi manager. Nah terus siapa yang akan memajukan industri IT? Contoh lainnya: jika semua sarjana pertanian beralih profesi ke berbagai bidang lain, bagaimana bisa maju pertanian Indonesia?

Kebanyakan jurusan teknik yang saya tahu minimal lulusannya memiliki dasar teori yang baik mengenai bidang ilmunya, dan memiliki keahlian praktis meskipun sangat minimal. Misalnya target pelajaran Teknik Kimia dan Teknik Fisika adalah untuk industri, dan saya tahu bahwa lulusan Teknik Kimia dan Fisika minimal punya keahlian praktis untuk mengenal dan mengoperasikan berbagai peralatan lab sederhana. Mereka juga memahami berbagai konsep dasar mengenai ilmu Kimia/Fisika.

Beda kasusnya dengan banyak lulusan IT yang saya tahu: banyak yang tidak bisa melakukan hal dasar. Install sistem operasi? tidak bisa, itu kan bisa dilakukan oleh dukungan teknis, Memasang kabel jaringan atau mengkonfigurasi router/firewall? tidak bisa, itu kan bagian jaringan.

Sedihnya lagi, seringkali skill pemakaian software juga rendah. Contoh kecil: Microsoft Word memiliki fitur otomatis untuk membuat daftar isi. Tapi banyak yang tidak tahu fitur ini dan daftar isinya seringkali dibuat secara manual. Memakai spreadsheet juga terbatas pada formula sederhana (tidak sampai LOOKUP atau Pivot). Saya tidak berharap seseorang jadi jago Ms Excel ketika lulus, tapi setidaknya konsep dasarnya tahu dan tidak bingung jika pindah ke OpenOffice atau Google Sheets. Sama seperti lulusan Teknik Fisika tidak akan bingung memakai timbangan, baik itu analog maupun digital.

Memang di jurusan IT ini gampang sekali mencontek: semua praktikum programming bisa mencontek/menyalin dengan mudah dari orang lain (via internet/jaringan lokal/USB disk). Semua tugas dan pekerjaan rumah bisa dicari jawabannya online (atau bisa pesan dari situs freelancer). Jadi kurang ada “paksaan” untuk serius mencoba.

Berbeda dengan lulusan Teknik Kimia yang pasti harus pernah melihat dan bekerja berbagai bahan kimia, hanya sedikit lulusan IT yang pernah bekerja dengan berbagai software praktis. Apakah yang diajarkan ketika kuliah terlalu banyak teori? Bagaimana dengan level skill yang lebih tinggi, misalnya membuat blueprint aplikasi (baik skala kecil ataupun besar) atau merancang database? ini juga biasanya tidak bisa.

Supaya praktikum IT bisa dilakukan dengan cepat, di kebanyakan tempat semua sudah disiapkan di awal. Semua software sudah terinstall dengan versi eksak yang sudah diberikan (kadang versi softwarenya sudah kuno), dan mahasiswa hanya perlu datang, mengetik (atau mencontek/download dari Internet/copy dengan USB Disk) lalu pulang. Keahlian mendebug program biasanya tidak diajarkan. Jika programnya lambat, umumnya tidak paham kenapa terjadi, baik secara teori dari analisis notasi Big-O ataupun secara praktis menggunakan tools profiler.

Kebanyakan mahasiswa yang ketika lulus bisa memprogram secara praktis (misalnya: membuat website, membuat game, membuat aplikasi) biasanya belajar sendiri berbagai keahlian itu. Jadi apakah ini salah kurikulumnya? salah dosennya?

Sebagian mungkin salah dosennya. Seringkali dosen tidak bisa menjelaskan dengan baik suatu topik. Bahkan banyak dosen yang tidak bisa memprogram sedangkan dosen tersebut mengajar pemrograman.

Kalau saya bertemu lulusan Teknik Kimia, saya cukup yakin dia akan bisa menjelaskan secara umum tentang dasar kimia (atau lulusan fisika untuk menjelaskan tentang dasar fisika). Sedangkan kalau saya tanyakan ke lulusan IT, cukup banyak yang tidak tahu menjelaskan dari mulai 0 dan 1, mesin turing, sampai bagaimana program bisa berjalan. Padahal dasar ilmu komputer tidak terlalu rumit.

Harapan saya seorang lulusan IT bisa tahu dasar teori dan bisa mempraktikkannya. Hapalan teori untuk dunia IT lebih sedikit dari kebanyakan bidang lain (kebanyakan hal bisa memakai logika saja). Dalam urusan praktis saat ini semua masalah bisa dicari solusinya dengan Google asalkan tahu apa yang perlu dicari. Jadi skill praktis minimal adalah: menginstall sesuatu, menjalankan sesuatu, dan mencari solusi suatu masalah di Google/StackOverflow. Tentunya dasar teori yang baik akan mendukung dalam hal praktis, misalnya jika sudah mengerti konsep OOP dengan baik, berpindah dari Java ke C# bisa dilakukan dengan cepat. Jika sudah mengerti konsep sistem operasi Unix, berpindah dari Linux ke FreeBSD/NetBSD/Solaris bisa dilakukan relatif singkat.

Saya tidak berharap lulusan IT bisa menjadi Superman yang bisa segala macam hal. Tapi yang diharapkan adalah: bisa cepat beradaptasi dengan berbagai hal praktis, dan juga bisa mengimplementasikan berbagai algoritma jika diperlukan. Jika ada suatu algoritma baru yang sangat baik dan ada deskripsi lengkapnya, maka bisa menyatakan: ok akan saya implementasikan dalam Python, dan bukan berkata: belum ada yang membuat versi Python-nya jadi kita tunggu saja sampai suatu saat ada yang mengimplementasikan (kadang kalau beruntung bisa cepat, tapi bisa juga beberapa tahun kemudian baru ada versi Python-nya)

Dasar Komputer itu Mudah

Sebagian masalah dalam dunia IT mungkin karena sekarang ini komputer sudah terlalu abstrak. Hal ini menyebabkan orang sulit memahami hal-hal dasar yang membentuk sebuah sistem komputer. Padahal Kurikulum informatika/ilmu komputer sebenarnya sudah dirancang dengan baik, tapi banyak yang tidak bisa melihat benang merah topik-topik yang diajarkan.

Akibat tidak terlihatnya benang merah ini, orang merasa belajar berbagai topik terpisah yang tidak dipahami konsepnya (misalnya pelajaran otomata, arsitektur komputer) dan juga tidak punya nilai praktis di kehidupan nyata (tetap tidak bisa assembly setelah arsitektur komputer, tidak bisa membuat parser setelah pelajaran otomata).

Di pelajaran matematika SMU (atau bahkan SMP) kita sudah diajari mengenai basis bilangan. Di luar konteks komputer basis bilangan ini biasanya kurang penting tapi karena komputer yang kita temui sehari-hari memakai sistem biner, maka ini penting. Menuliskan nilai biner bisa sangat panjang, jadi kita biasanya juga memakai basis 8 (mengelompokkan 3 bit biner jadi satu digit basis 8) dan basis 16 (mengelompokkan 4 bit biner jadi satu digit basis 16).

Kuliah arsitektur komputer biasanya akan memperkenalkan gate dasar, seperti AND, OR, NOT, dsb. Gate-gate ini kemudian disusun untuk membuat sebuah binary adder (penjumlah 1 bit dengan 1 bit). Sepertinya ini tidak penting, tapi ingat waktu kita masih SD, kita diajari untuk menghapal penjumlahan satu digit (seperti 9 + 7), supaya berikutnya kita bisa menjumlahkan angka yang lebih besar (misalnya 19+27) dengan menjumlahkan dulu digit paling kanan (9+7 = 16), lalu jika ada lebihnya (carry, dalam kasus ini ada carry 1) ditambahkan ke penjumlahan berikutnya (1 + 2 + carry).

Sama seperti ilmu penjumlahan satu digit desimal bisa dipakai untuk n-digit. Sirkuit adder ini bisa disusun dengan adder yang lain agar bisa menjumlahkan bukan cuma 1 digit biner tapi n digit biner. Sekarang kita bisa menjumlahkan bilangan sebesar apapun. Karena bisa menjumlahkan, kita juga bisa mengalikan, perkalian hanyalah penjumlahan yang diulang.

Bagaimana dengan pengurangan? kita bisa merepresentasikan bilangan negatif dengan menggunakan two’s complement. Sekarang jika kita punya angka 2, angka -1 dan sirkuit adder, kita bisa menjumlahkan 2 dan -1 dan hasilnya adalah 1. Jadi dengan memahami representasi tersebut, kita bisa mengurangi, dan jika kita bisa mengurangi, maka kita bisa membagi.

Bisa mengurangi juga berarti bisa membandingkan. Sebuah bilangan a sama dengan b jika a dikurangi b nilainya nol. Sebuah bilangan a lebih dari b jika a dikurangi b nilainya positif, dan sebaliknya a kurang dari b jika a dikurangi b nilainya negatif.

Topik lain yang akan diajarkan adalah flip-flop atau latch. Intinya adalah sirkuit ini bisa “mengingat” atau menyimpan satu bit. Jika kita bisa menyimpan satu bit, maka dengan banyak flip-flop kita bisa menyimpan banyak bit. Ini adalah topik dasar memori. Topik clock juga biasanya akan dijelaskan untuk memahami urutan operasi.

Dalam sebuah sirkuit digital, kita bisa memilih (dengan multiplexer dan demultiplexer) sirkuit mana yang aktif. Jadi  kita bisa memasukkan dua bilangan biner, dan memilih apakah ingin membagi atau menjumlah, atau melakukan operasi lain.

Sebagai manusia kita bisa memasukkan sekuens biner ini (yang merupakan “instruksi”)secara manual  satu persatu: tekan ini untuk menjumlah, lalu tekan ini untuk mengurangi, dst seperti memakai kalkulator. Tapi karena kita sudah mengenal memori (dari topik flip-flop), maka bilangan dan urutan instruksi tersebut bisa dimasukkan ke dalam memori, dan kemudian dieksekusi.

Setelah itu topik akan berlanjut ke berbagai detail bagaimana membuat instruksi yang lebih kompleks yang tidak hanya menjalankan instruksi secara linear dari pertama sampai terakhir tapi bisa juga lompat instruksi tertentu (jump) jika kondisi  terpenuhi (biasanya kondisi ini dari hasil komparasi, yang pada dasarnya adalah pengurangan). Inilah dasar sebuah komputer.

Tanpa sebuah “bahasa pemrograman” dan bahkan tanpa sebuah “assembler”, dasar teori tadi sudah cukup untuk menjelaskan komputer sangat sederhana, dan bahkan komputer paling awal dulu ya seperti ini: input output biner, tanpa assembler/shell/editor/user interface.

Gambar berikut ini adalah PDP-8, komputer pertama yang sukses di pasaran. Komputer ini mulai dipasarkan tahun 1965 dan terjual 50 ribu buah komputer. Dulu harganya 18500 USD, dengan menghitung inflasi kira-kira saat ini setara sekitar 2 milyar rupiah).

Jadi kita mengisi memori (baik instruksi maupun data) langsung dengan mengeset bit 0 dan 1 menggunakan saklar, lalu menekan tombol untuk mengirimkan bahwa kita sudah selesai mengisi. Ada tombol juga untuk pergi ke memori berikutnya. Outputnya pun berupa biner dalam bentuk lampu yang menyala.

Komputer populer berikutnya di tahun 1976 adalah KIM-1. Komputer ini tidak sesulit PDP-8, input dalam bahasa mesin menggunakan keypad heksadesimal, dan output 6 digit angka. Komputernya memang seperti di bawah ini, tidak ada case-nya (245 USD pada tahun 1976, setara dengan 15 juta rupiah nilai saat ini). Prinsip kerjanya masih sama dengan komputer sebelumnya: input disederhanakan dengan keypad dan output dengan bilangan heksadesimal 6 digit. Semua harus diprogram dalam bahasa mesin.

KIM-1

Apakah kita masih bisa bereksperimen dengan benda low level seperti ini? Sangat bisa. Kita bisa membeli transistor sendiri dan menyusun komputer sendiri (harganya sangat murah). Adakah orang yang “gila” untuk melakukan hal ini? Jawabnya: ada, contohnya proyek monster6502

Menyusun transistor memang terlalu hardcore (satu gerbang logika butuh beberapa transistor), alternatif lain adalah membeli chip yang mengimplementasikan gate tertentu (NAND, OR, NOT, dsb). Kemudian kita bisa menyusun sendiri chip-chip ini untuk membentuk komputer. Ada banyak orang yang iseng melakukan hal ini. Ekseperiman semacam ini sekarang tidak penting, tapi bagi orang yang cara belajarnya bisa paham melalui praktik, saya hanya ingin menyatakan bahwa ini masih bisa dilakukan.

Jika kita hanya ingin bekerja secara konseptual tanpa praktik langsung, ada banyak emulator yang bisa kita pakai, termasuk juga emulator untuk berbagai komputer awal. Sebagai catatan, dulu di masa awal komputer, bahkan ada buku belajar bahasa mesin untuk anak-anak (klik pada gambar untuk link ke PDF-nya, sudah digratiskan oleh penerbitnya).

Buku lama ini saat ini juga tidak terlalu berguna, kecuali Anda penyuka sistem klasik, tapi ilmunya masih bisa dipakai untuk membuat emulator. Berbagai dasar low level ini juga diperlukan jika kita ingin membuat compiler atau interpreter yang memakai JIT.

Berbagai mata kuliah lain saling melengkapi. Mata kuliah Teori bahasa dan Otomata akan memberikan dasar penting: bahwa komputer yang sudah dijelaskan di arsitektur komputer ini bisa dipakai untuk menghitung/menjalankan algoritma semua fungsi yang computable. Selain itu ada teori bagaimana sebuah bahasa bisa di-parse ini akan menjelaskan kenapa bahasa pemrograman tidak seperti bahasa manusia.

Setelah memahami bagian dasar ini, topik pemrograman akan terasa lebih sederhana. Semua yang diproses komputer hanyalah bilangan. Sebuah teks hanyalah pemetaan dari bilangan ke sebuah karakter (misalnya bilangan 65 berarti karakter A di tabel ASCII). Sebuah foto di layar hanyalah titik-titik dengan nilai warna tertentu (nilai warna ini juga hanya bilangan) dan video hanyalah gambar yang berganti dengan cepat seolah bergerak. Signal suara yang mentah di komputer hanyalah nilai sampling amplitudo setiap interval waktu tertentu.

Jika sudah memahami layout memori, kebanyakan algoritma dan struktur data dasar bisa dipahami dengan logika saja dan terasa sangat wajar, tidak perlu menghapal. Contoh struktur data yang mudah adalah: linked list, tree, hash table. Contoh algoritma sederhana: berbagai sorting dasar.

Beberapa struktur data dan algoritma memang rumit, tapi biasanya kita tidak perlu mengimplementasikan berbagai algoritma ini dalam pemrograman sehari-hari. Hal yang penting adalah: kita paham algoritma tersebut ada dan bisa dipakai di kasus seperti apa, dan dari deskripsi detail algoritmanya kita bisa mengimplementasikan algoritma itu di bahasa tertentu yang mungkin baru kita kenal.

Berbagai pelajaran lainnya sebenarnya hanyalah penerapan dari dasar yang sudah dipelajari. Misalnya: sistem operasi memberikan abstraksi supaya kita tidak mengakses hardware secara low level, dan bagaimana mengatur sumberdaya sistem supaya bisa dipakai oleh banyak program/user. Pemrograman grafis adalah penerapan dari berbagai algoritma dasar, algoritma yang berhubungan dengan matriks, dan algoritma spesifik untuk grafik tertentu.

Berbagai hal praktis bisa dijelaskan ketika praktikum. Dan untuk mendalami suatu topik tertentu sebaiknya dilakukan sendiri di luar kelas. Contoh: jika ingin menjadi network engineer untuk merk tertentu (CISCO, JUNIPER, dsb) ya pelajari materi dari vendor tersebut.

Mungkin ada juga yang berpikir: ah nggak perlu tahu sampai sedetail itu cukup kok buat cari kerja. Sekali lagi saya tekankan: kalau sekedar supaya bisa memprogram sederhana, lulusan SMK juga bisa diarahkan. Kalau ingin Indonesia punya tenaga ahli yang bisa memajukan dunia IT, ya pengetahuan sangat low level dibutuhkan.

Ingin jadi ahli security yang baik, yang bisa menemukan bug sejenis Spectre? perlu tahu sampai level hardware. Jika ingin mendapatkan overview yang cukup baik bisa membaca buku yang membahas sampai level ini Silence On the Wire oleh Michal Zalewski, pada tiap bab diberikan pengenalan berbagai topik informatika dasar untuk bisa menjelaskan bug security. Deskripsi buku ini cukup akurat:

In Silence on the Wire: A Field Guide to Passive Reconnaissance and Indirect Attacks, Zalewski shares his expertise and experience to explain how computers and networks work, how information is processed and delivered, and what security threats lurk in the shadows.

Memang saat ini sudah banyak sekali berbagai produk open source untuk membuat apapun, tapi untuk menjadi terdepan tetap dibutuhkan berbagai komponen khusus buatan sendiri. Contohnya: untuk membuat sistem chat dengan skala WhatsApp atau Telegram tetap dibutuhkan sistem custom . Telegram hanya membuka source code aplikasi client untuk Desktop/Web/Mobile, tapi komponen server tetap milik mereka dan tetap tertutup.

Berbagai perusahaan besar bisa menjadi terdepan karena mereka menciptakan sendiri teknologi yang saat itu belum ada. Misalnya Google bisa maju karena algoritma PageRank dan juga memiliki BigTagble untuk implementasinya.

Penutup

Semua di atas hanyalah gabungan dari berbagai fakta dicampur dengan opini saya. Jika tujuannya memang hanya mencari kerja, ya silakan saja belajar berbagai hal yang praktis. Tapi saya berharap lulusan jurusan IT levelnya lebih dari sekedar praktis (apalagi sekedar bisa memakai produk buatan orang lain), tapi bisa tahu berbagai konsep dasar dan mengaplikasikannya.

Sebagai tambahan untuk yang masih kuliah dan merasa blank saya sarankan untuk mulai mengubah cara belajar dan mencari suplemen materi lain, misalnya dari Coursera atau YouTube.

Dua buku saya sarankan: Code: The Hidden Language of Computer Hardware and Software, buku ini ringan dengan banyak penjelasan sederhana. Buku lainnya adalah The Elements of computing systems. Buku ini sangat praktis dan mencakup topik dasar sampai lanjut.

Kemungkinan akan ada banyak yang kurang setuju dengan tulisan ini. Buat yang kurang setuju dengan isi tulisan ini, mungkin bisa menjawab dua pertanyaan saya:

  1. Jika bukan lulusan jurusan IT, jadi lulusan mana yang seharusnya bisa memajukan dunia IT Indonesia? (Apakah harus mengimpor programmer dari India?)
  2. Menurut Anda lulusan jurusan IT itu minimal harus bisa apa? Di mana keseimbangan sangat praktis (seperti diajarkan di SMK) atau sangat teoretis (level S2/S3)?

Seri Buku Micro Adventure

Ini cuma kisah singkat mengenai seri buku cerita yang saat ini mulai disukai Jonathan: Micro Adventure. Seri ini diterbitkan di tahun 1980-an  oleh Scholastic dan cukup terkenal pada masanya.  Satu hal yang menarik dari buku-buku ini adalah: di dalamnya ada program dalam bahasa BASIC yang bisa diketikkan dan merupakan bagian dari cerita.

Jonathan sedang menyalink kode dari buku ke QBasic di Dosbox
Jonathan sedang menyalink kode dari buku ke QBasic di Dosbox

Buku pertama yang selesai dibaca Jonathan adalah Space Attack, buku ini terbit tahun 1984.

Di awal cerita buku pertama ada pesan rahasia yang harus didekrip. Sebenarnya bisa didekrip manual (caesar cipher), tapi lebih menarik jika didekrip dengan program.

Program yang diberikan dapat berjalan di berbagai komputer yang ada di jaman itu jika ada tanda centang untuk platform tersebut, dan kadang diperlukan modifikasi untuk komputer tertentu dengan cara modifikasi diberikan di akhir buku.

Waktu saya kecil, saya tidak pernah tahu mengenai seri buku ini karena sampai 1986 saya tinggal di desa tanpa listrik dan baru punya komputer pertama tahun 1993.  Ketika mendengar mengenai seri buku ini beberapa tahun yang lalu, saya juga tetap tidak tertarik membacanya, dan saya pikir tidak akan menarik untuk anak modern seperti Jonathan yang saya sudah saya ajari  berbagai cara modern coding dengan Scratch, Scratch Jr, dan berbagai aplikasi coding di iPad. Di sini saya melihat kelemahan Scratch yang terlalu visual, sehingga kurang cocok menyelesaikan masalah sederhana seperti enkripsi di buku tersebut.

Tapi ternyata ketika saya sedang melihat (ulang) video Youtube The basics of BASIC, the programming language of the 1980s, Jonathan ikut melihat dan tertarik dengan buku yang ditunjukkan. Dia sangat bersemangat membaca bukuya dan mengetikkan kode program dalam buku (versi PDF) ke QBasic yang saya jalankan di Dosbox di Linux, menjalankan programnya, merasa senang melihat outputnya benar, dan juga tertawa riang ketika ada lelucon yang dienkripsi.

Sebagai catatan, saya memilih QBasic karena tahu kompatibilitasnya dengan BASIC di IBM PC (sehingga kode dalam buku tersebut pasti jalan). Meskipun ada proyek open source QB64 yang katanya kompatibel dengan QBasic (yang berarti kompatibel dengan BASIC di IBM PC) tapi karena menggunakan mode kompilasi (bukan interpretasi), maka terasa sangat lambat, dari mulai menekan F5 sampai program berjalan bisa butuh 5 detik, sedangkan menekan F5 di QBasic program langsung berjalan instan.

Ada juga bagian program yang agak rumit untuk Jonathan (usia  7 tahun) yang tidak bisa saya jelaskan secara singkat, misalnya frequency analysis (yang dalam implementasi programnya butuh pemahaman konsep array). Akhirnya setelah beberapa program, dia menyelesaikan membaca isi bukunya dalam beberapa jam, dan setelah itu baru meneruskan lagi mengetik programnya.

Ada hal yang menarik di salah satu program yang diberikan, pembaca diminta untuk “membaca” atau “Reverse engineer” sebuah program. Dari program singkat berikut diminta untuk mencari tahu input apa yang perlu diberikan untuk bisa “membuka Airlock” dan untuk mengirim “S.O.S”.

Ternyata bahasa BASIC ini memang cocok untuk pemula, karena Jonathan yang belum pernah saya ajari BASIC bisa langsung memahami input apa yang harus diberikan. Bahasa BASIC ini memang kurang terstruktur, dan kalau direnungkan, masalah struktur dalam BASIC tidak terlalu jauh dari assembly (dengan jump/goto).

Saya tidak tahu berapa buku yang akan diselesaikan oleh Jonathan (ada 10 buku dalam seri Micro Adventure), tapi saya cukup terkesan bahwa buku terbitan 34 tahun yang lalu ini masih dianggap menarik oleh anak modern seperti Jonathan.

Kisah sebuah bug kecil

Saya mau cerita tentang sebuah bug yang saya perbaiki dan dapat bounty 200 USD plus kerjaan ekstra yang menyusul dari ini. Meski secara nilai ini kecil dibandingkan banyak proyek lain, tapi ada banyak hal yang membuat gembira dari satu bug kecil ini sehingga ingin saya ceritakan.

Maaf, ini bukan cerita tentang serangga, tapi bug software

Cerita singkatnya: teman saya memakai software open source QZ, sebuah library untuk printing via web browser. Jadi jika client menginstall software ini di PC-nya maka web app yang memakai library QZ bisa mengakses langsung printer lokal. Langsung di sini artinya bisa mengirimkan kode mentah, sehingga printing bisa cepat dan mendukung berbagai fitur spesifik printer. Fitur semacam ini dibutuhkan untuk software Point Of Sales, aplikasi bank atau sejenisnya yang butuh langsung mencetak ke printer yang tidak standar (misalnya printer thermal, printer buku tabungan, dsb). Lanjutkan membaca “Kisah sebuah bug kecil”

Pengantar Reverse Engineering

Sudah beberapa kali saya ditanya: kalo ada aplikasi X bagaimana cara membongkarnya? Bahasa kerennya: bagaimana saya melakukan reverse engineering terhadap aplikasi tertentu?. Sayangnya tidak ada jawaban sederhana untuk ini. Bagaimana membongkar sesuatu tergantung pada teknologi yang digunakan untuk membangun dan memproteksi benda itu. Berbagai tools juga bergantung pada sistem operasi yang menjadi target.

Saya sudah menulis secara umum tentang reverse engineering, tapi belum memberikan jawaban praktis, jadi di posting ini saya akan berusaha menuliskan secara praktis langkah-langkah untuk memulai reverse engineering.

label
convert -size 1200×630 -background white -fill black -font Nimbus-Mono-L -pointsize 144 -gravity center -label:”Reverse\nEngineering” -flip label.png

Lanjutkan membaca “Pengantar Reverse Engineering”

Mengapa Harga Pembuatan Aplikasi Mobile Mahal

Salah satu pertanyaan yang sering diajukan ke saya adalah: berapa harganya membuat aplikasi mobile. Jawaban saya biasanya: tergantung aplikasinya, tapi minimal beberapa juta (ini benar-benar minimal, untuk aplikasi statik sangat sederhana sekali), biasanya angka yang saya sebutkan adalah belasan atau puluhan juta, dan kadang sampai ratusan juta. Sebagian terkejut dengan angka ini, tapi ini bukan angka yang mengada-ada, Anda bisa mencari-cari di berbagai artikel lokal ataupun berbahasa Inggris. bahwa angka ini sangat wajar

Sebelum Anda membaca panjang lebar, coba salah satu web yang memperkirakan biaya pembuatan app. Lalu kembali ke sini untuk mengetahui kenapa bisa semahal itu. Untuk yang malas mengklik, estimasi biaya minimum lebih dari 2000 USD, dan umumnya lebih dari 20 ribu USD.

Saat ini saya sendiri tidak banyak mengembangkan aplikasi mobile, tapi cukup mengenal dunianya. Saya akan menjelaskan secara sederhana proses pembuatan dan penerbitan aplikasi ini, supaya sebagai orang yang meminta pembuatan aplikasi bisa mengerti. Ceritanya agak panjang, tapi saya harap tidak terlalu teknis.
Lanjutkan membaca “Mengapa Harga Pembuatan Aplikasi Mobile Mahal”

Menulis program Alkitab, dulu dan sekarang

Di posting ini saya ingin sedikit bernostalgia membuat program Alkitab di device Nokia 3650 yang sangat terbatas, sampai device terbaru Blackberry 10 yang sangat mudah. Isinya kebanyakan teknis pemrograman mengenai betapa sulitnya dulu membuat program Alkitab, dan betapa mudahnya sekarang membuat program Alkitab.

Warning: posting ini panjang sekali. Dan jika Anda bukan programmer, mungkin bisa dibaca singkat saja ke bagian akhir (penutup).

Lanjutkan membaca “Menulis program Alkitab, dulu dan sekarang”