/ #parity-bit #hash 

Mengenal Integrity dalam Private Key Infrastucture

Salah satu hal penting ketika mengirimkan data/pesan menggunakan jaringan pada komputer adalah Integrity. Jika kita merujuk kepada KBBI, arti dari Integrity atau Integritas adalah mutu, sifat, atau keadaan yang menunjukkan kesatuan yang utuh. Hal ini selaras dengan topik yang dibahas pada integrity ini pada lingkup teknik komputer. Yaitu tentang menjamin pesan atau konten yang dikirim pada komputer tidak berubah pada saat transit di komputer tujuan.

Bukan tidak mungkin konten ataupun pesan digital yang dikirim melewati jaringan dapat berubah karena tentu tidak ada yang ideal di dunia ini. Data bisa saja dilewatkan pada link yang tidak sempurna sehingga terjadi error di tengah jalan. Bisa jadi eror tersebut merubah bentuk data karena persoalan layer bawah OSI layer, yaitu masalah fisik. Bisa jadi berubah karena ada orang yang kurang bertanggung jawab mengubahnya atau hal-hal lainnya.

Cara sederhana pada permasalahan ini adalah dengan mengirim konten tersebut dua kali agar menjaga konten yang dikirim tidak salah. Jika satu salah masih ada backup-nya. Namun tentu saja hal tersebut merupakan pemborosan dan bisa memakan bandwith dua kali lipat juga. Untuk itu terdapat beberapa teknik yang bisa disebut dengan ‘error detection’ untuk menunjang integritas yang lebih efisien.

Teknik tersebut diantaranya adalah Parity-Bit, Checksum, CRC (Cyclic Redundancy Check), beberapa algoritma hash seperti md5, sha1, sha2 akan dibahas pada makalah ini. Teknik tersebut akan dibahas tiap bab dimulai dari definisi beserta contohnya dan kegagalan (flaw) pada teknik tersebut.

Parity-Bit

Parity-Bit atau Parity Check merupakan teknik yang telah lama diterapkan. “Par” pada “parity” berasal dari istilah di olahraga golf yang menandakan sebuah standar. Misalnya 1 par, 2 par, sedikit 3 par dibawah. Parity adalah sebuah kata yang mewakili kata “Equality” atau lebih tepatnya “Equivalence” pada bahasa Inggris. Bagaimana kah Parity Bit bekerja ?

Di sebuah jaringan, komputer mengirimkan datanya berupa bongkahan diskrit yang disebut dengan paket. Paket dapat bervariasi ukurannya, namun umumnya diukur dengan satuan byte. Seperti yang kita ketahui, 1 byte berarti 8 bit. Misalkan data yang akan kita kirim adalah  11001101 seperti pada gambar di bawah ini

(Gambar 1.1 Paket 8-bit)

Karena paket tersebut dikirimkan oleh sinyal elektrik, pada saat tiba di tujuan, data tersebut bisa saja berubah. Mungkin karena interferensi medan magnet pada kabel atau mungkin karena signal-loss, data tersebut berubah menjadi seperti gambar 1.2. Sehingga bit ketiga yang awalnya 0 terbacanya menjadi 1 di komputer tujuan.

(Gambar 1.2 Paket 8-bit diterima komputer)

Beda 1 bit ini tentunya berbeda cukup jauh. Pada gambar 1.1 jika kita hitung maka nilainya 205 sedangkan pada gambar 1.2 nilainya 237. Bagaimana parity check menyelesaikan masalah ini? Caranya adalah dengan menggantikan bit terakhir dengan yang disebut “parity-bit”. Pada Gambar 1.3 akan saya buatkan contoh yang baru karena bentuk paketnya berubah menjadi 7 bit pesan, 1 bit untuk parity bit.

(Gambar 1.3 Parity Check)

Pada gambar 1.3 dikirim data 0011011 sedangkan diterimanya 0011001. Terdapat perubahan pada bit ke 6 yang awalnya 1 menjadi 0. Nah pada bit terakhir, fungsinya begini. Ada aturan even parity dan odd parity atau ganjil-genap. Misalkan pada gambar diatas menggunakan even parity. Kita lihat terlebih dahulu ada berapa kah angka 1-nya? Tentu saja 4. Jumlah tersebut merupakan angka genap. Maka parity bit-nya adalah 0.

Baik penerima maupun pengirim harus setuju menggunakan even parity. Sehingga jika kita lihat pada gambar 1.3 lagi, parity bit-nya 0 sedangkan angka 1-nya ada 3. Tentunya tidak valid karena angka 1 nya ganjil. Jadi bagian penerima bisa mengetahui apakah data tersebut sudah berubah atau masih utuh seperti awal.

Even parity dan Odd parity sama, jika jumlah bit berisi 1-nya ada ganjil maka bit terakhir diisi 0. Cara ini bekerja dengan baik asal, parity-bit nya tidak berubah. Hal ini lah yang menjadi masalah pada teknik Parity Check ini.

Jika bit terakhirnya berubah, komputer penerima akan menganggap data yang sudah utuh tapi dianggap tidak valid. Namun permasalahan tidak berhenti disitu, bagaimana jika parity bitnya berubah namun salah satu data pada message-nya juga berubah? Hal ini malah menganggap data yang tidak utuh menjadi dianggap valid.

Metode yang sederhana ini walaupun terdapat celah kesalahannya, harapannya dapat menjadi batu loncatan awal untuk mengerti Integrity lebih jauh. Setelah Parity bit, kita akan lanjutkan pada metode kedua yaitu Checksum.

Checksum

Pada parity check, yang diperiksa dari data atau konten digital tersebut adalah tentang apakah ganjil ataukah genap. Namun pada Checksum, membutuhkan sedikit kalkulasi. Bisa kita lihat dari kata Checksum terdapat “Sum” yang berarti penjumlahan. Bagaimana kah penjumlahan dapat membantu memeriksa apakah suatu konten digital utuh atau tidak saat diterima?

Misalkan saja komputer pengirim ingin mengirimkan sebuah teks yang terdiri dari A hingga Z atau sejumlah 26 karakter dari 0 hingga 25. Konten yang dikirimkan pengirim misalkan saja “25 11 12 7 13 4” dengan modulus yaitu 16. Kedua komputer baik penerima maupun pengirim harus setuju dengan angka modulus yang digunakan.

Langkah selanjutnya masih di komputer pengirim. Komputer pengirim akan menghitung jumlah dari konten tersebut yaitu 25 + 12 + 7 + 13 + 4 menjadi 72. Selanjutnya komputer pengirim akan menghitung 72 modulus 16 yaitu sisanya sebuah remainder sejumlah 8. Karena 64 adalah kelipatan terbesar yang bisa mendekati angka 72 dengan sisa sejumlah 8.

Angka 8 ini adalah yang akan kita sebut dengan “Checksum”. Sama seperti parity check, angka 8 ini akan ikut dikirim ke komputer tujuan. Seperti diilustrasikan pada gambar 2.1 ini.

(Gambar 2.1 paket data dan checksum)

Seperti pada parity check, komputer penerima akan mengakui bahwa bit terakhir merupakan bagian dari pesan untuk membantu apakah pesan tersebut masih utuh atau tidak. Misalkan saja konten yang diterima komputer penerima adalah “24 11 12 7 13 14 8”.

Komputer penerima akan mengetahui bahwa konten tersebut tidak valid. Bagaimana mengetahuinya? Jika kita lihat jumlahnya menjadi 71 sedangkan jika dimoduluskan dengan 16 hasilnya akan 7. Nilai checksum tidak sama dengan nilai checksum di pesannya.

Checksum merupakan ide yang bagus untuk permasalahan integritas. Namun permasalahannya sama dengan parity check. Pesan yang tidak valid masih bisa dianggap valid oleh penerima. Misalkan saja pada gambar 2.1 nilai 25 turun menjadi 24 namun nilai 11 naik menjadi 12. Hal ini akan tetap dianggap pesan yang valid karena nilai checksum tetap benar.

Walaupun masih terdapat kesalahan, namun tentu saja Checksum lebih baik satu langkah daripada Parity Check pada bab sebelumnya. Namun masih ada yang lebih baik lagi daripada keduanya yaitu CRC pada bab ke tiga berikut.

CRC (Cyclic Redundancy Check)

Dasar-dasar dari parity-check dan checksum masih digunakan pada CRC. Nama CRC sedikit rumit dan panjang namun sebenarnya metode ini tidak terlalu rumit. Dari bahasa sendiri saya masih kesulitan dalam mengartikan hubungan antara pengecheckan cyclic dan redundansi. Namun langsung saja kita lihat terlebih dahulu bagaimana cara kerjanya.

Misalkan saja komputer pengirim masih mengirim data yang sama seperti sebelumnya “25 11 12 7 13 4”. Oleh komputer pengirim data ini dituliskan “251112071304”, menjadi angka yang sangat besar. Sama seperti sebelumnya terdapat 1 angka sebagai pembagi atau saya sebut saja sebagai modulus. Siklik pada CRC ini sebenarnya membagi dengan angka tersebut berulang-ulang hingga menyisakan angka kecil yang mewakili angka besar tersebut. Yang mana cara tersebut sama saja seperti dengan modulus.

Jadi angka “251112071304” tersebut dibagi dengan 16 berulang-ulang sampai tidak bisa dibagi lagi dengan 16. Sehingga muncullah angka 8. Angka 8 ini sama seperti checksum maupun parity bit, dikirim juga bersama pesannya.

(Gambar 3.1 gambaran CRC)

Bagian komputer penerima akan memeriksa apakah pesan ini valid atau tidak dengan cara membaginya kembali dengan angka 16 yang sebelumnya sudah sama-sama “disetujui”. Apabila tidak cocok dengan 8 maka tentu saja pesan tidak valid dan komputer penerima akan meminta komputer pengirim mengirim ulang pesan.  Sederhananya seperti itu namun tentu saja CRC sedikit rumit lagi karena dibagi menggunakan polinomial namun prinsip angka sisa yaitu 8 tadi sebagai “short value representing the data” untuk memeriksa tetaplah sama.

Kesalahan pada metode ini sedikit meminimalisir checksum dimana ada satu bit yang dinaikkan satunya diturunkan, dianggap valid. Hal ini tidak ditemukan pada CRC. Menaikkan bit pesannya harus senilai dengan kelipatan dari nilai pembaginya.

Algoritma Hash dan MD5

MD5 dan SHA adalah algoritma hash. Terdengar rumit namun menurut perspektif saya, algoritma hash ini sama seperti parity-check dengan parity-bit-nya, checksum dengan angka checksum-nya dan angka sisa dari CRC. Persamaannya mengerucut pada 1 kalimat yaitu “short value representing the data”.

Jika kita melihat hash sendiri, kebanyakan persoalan hash akan direferensikan ke fungsi hash atau h(x). Fungsi tentu saja memiliki 3 bagian yaitu input, output dan proses. Pada fungsi hash, umumnya adalah strings, integer ataupun tipe data lainnya. Sedangkan outputnya adalah string atau number. Output ini yang sering orang sebut sebagai “hash”. Proses yang dilakukan adalah meringkas input tersebut. Fungsi hash harus mudah dalam komputasi dan output harus relatif kecil.

Faktanya pada metode checksum kita sebenarnya melakukan fungsi hash. Hash paling sederhana adalah h(x) = x mod number. Dimana x adalah 0 hingga 99999999 dan number adalah pembagi jika kita merujuk pada bab sebelumnya, si angka “16” tersebut. Kurang lebih gambaran umum dari fungsi hash ada di gambar 4.1 berikut :

(Gambar 4.1 Fungsi Hash MD5)

Untuk mengerti apa itu MD5, bisa dilihat pada gambar 4.1 di atas. Input pertama yang saya masukkan pada fungsi hash MD5 adalah sebuah string “halo semuanya ini adalah sebuah string input” maka outputnya adalah  ”6d4643d14cd7a523bfb0aa5b7ee829b9”. Bagaimana jika saya tambahkan inputnya menjadi “halo semuanya ini adalah sebuah string input asdlkjasdlkjskalsjas asdasd blablabla” ? hasilnya adalah sebuah string “b1cf1e788d034b0c7780fefde35ac53d” dengan panjang yang sama dengan input sebelumnya namun isinya berbeda. Untuk mencoba fungsi hash MD5 ini maupun SHA bisa menggunakan https://sha1-online.com.

(Gambar 4.2 Hash pada input ke dua dan check)

Kembali lagi ke masalah Integrity. Bagaimana jika pesan yang di kirim yaitu input pertama namun sampai di penerima ternyata yang muncul input ke dua? Tentu tinggal mengkomparasi saja hashnya apakah sama? Jika berbeda maka tentu saja konten tersebut tidak valid.

Algoritma hash dapat mengkonversikan tidak hanya 1 kalimat saja, namun bisa data sebesar sekian megabytes ataupun gigabytes menjadi 32 karakter string-number saja seperti pada paragaf sebelumnya.  Kurang lebih seperti itulah Algoritma Hash. Salah satu algoritma hash yang populer beberapa tahun dahulu adalah MD5. Dirilis pada 1992 oleh Prof. Ronald Rivest dari MIT sebagai kelanjutan dari MD4 satu tahun sebelum SHA muncul.

MD5 atau kepanjangan dari Message-Digest Algorithm memproduksi 128-bit nilai hash. Mengapa MD5 sekarang sebaknya tidak digunakan? Karena salah satu fungsi hash kriptografi yang paling penting adalah sulitnya menemukan pasangan hash yang identik. Karena jika ditemukan pasangan yang identik sama seperti problem pada metode sebelumnya. Data yang seharusnya tidak valid akan dianggap Valid.

Pasangan dari MD5 maksudnya begini. Misalkan kata “aku” dan “dia”, 2 kata tersebut jika dibuatkan hash dengan MD5 akan mengeluarkan hash yang sama (hanya contoh). Tentu hal ini tidak aman. Salah satu contoh dari hash collision ini seperti pada string berikut yang dibuat menggunakan bahasa python :

(Gambar 4.3 Hash Collison pada MD5)

MD5 awalnya memang dibuat agar collision-resistance karena ia merupakan fungsi hash yang kriptografi. Idealnya terdapat 2 pangkat 128 kemungkinan nilai untuk mendapatkan collision. Namun tentu saja kekuatan komputasi komputer pada tahun 1992 dan sekarang terpaut sangat jauh. Sekarang mudah dilakukan brute-force untuk menemukan 1 output namun dengan input yang berbeda. Sehingga idealnya MD5 sekarang harus ditinggalkan dan beralih ke SHA.

SHA (Secure Hash Algorithm)

Jika kita membuka situs https://sha1-online.com maka kita menemukan banyak sekali agoritma hash dengan kriptografi seperti sha1, md2, md4, md5, sha256, sha384, sha512, ripemd, whirlpool, tiger, snefru, gost, adler32, crc32, crc32b, haval dan sebagainya. Kalau kita mencoba memasukkan input 1 pada bab MD5 dengan algoritma SHA1, apakah hasilnya?

Hasilnya adalah “dbeb3a6289de028fdf02fea37544630b7d80d4b5”. Bagaimana dengan input kedua? Hasilnya adalah “295dae2e0e18a9b19b68086e55b18670184d1211”. SHA1 dan MD5 memiliki output yang agaknya sama mirip dengan MD5 yaitu string dengan kombinasi huruf dan nomor bedanya MD5 ukurannya 32 karakter, SHA1 ukurannya 40 karakter.

SHA dipublikasikan oleh NIST (National Institute of Standards and Technology) Amerika Serikat dengan versi Awal adalah SHA-0 atau SHA saja. Dua tahun kemudian SHA-1 muncul dengan panjang bit yang sama 160 bits dan perubahan yang tidak terlalu signifikan.

Sebenarnya ada banyak jenis SHA ini namun dikategorikan menjadi 4 yaitu SHA-0, SHA-1, SHA-2, SHA-3. SHA-2 memiliki beberapa versi dengan ukuran output bervariasi mulai dari 225 hingga 512 begitupun juga dengan ukuran block maupun internal state. SHA dalam prakteknya sudah bertahun-tahun sudah digunakan seperti swiss army-nya fungsi hash. Namun untuk SHA-0 atau SHA-1 lebih dari 20 tahuns sejak pertama kali diperkenalkan, pada tahun 2015 Google berkolaborasi dengan CWI institute Amsterdam pun sudah memperkenalkan teknik untuk melakukan collision pada hash ini. Kita bisa mencobanya pada halaman https://shattered.it.

(Gambar 5.1 Ilustrasi hash collision. Sumber: https://security.googleblog.com/2017/02/announcing-first-sha1-collision.html)

Pada gambar 5.1 saya peroleh dari situs blog keamanan google, dapat kita ketahui collision attack pada good doc dan bad doc dapat memiliki nilai hash yang sama jika menggunakan SHA1. Sebagai gantinya maupun mitigasinya tentu beralih ke SHA2 adalah langkah wajib.  Jika kita memasukkan input ke satu pada SHA2 seperti SHA256 contohnya, akan keluar 64 karakter hash yang mana 24 karakter lebih panjang daripada SHA1.

Pada forum StackExchange, saya mendapatkan informasi bahwa untuk melakukan collision attack pada SHA256, membutuhkan waktu selama 3.6 x 1013 untuk membobolnya secara brute-force. Padahal alam semesta kita baru ada selama 13.7 x 109 saja. Namun perlu digaris bawahi bahwa kecepatan komputasi dengan GPU khususnya semakin lama semakin cepat dan semakin murah karena demand untuk block-chain maupun gaming. Bukan tidak mungkin algoritma hash SHA2 juga akan bobol. Hash collision juga merupakan tantangan untuk masalah Integrity pada pengririman file pada jaringan, maupun komputasi bergerak. Diperlukan riset terus menerus untuk menemukan cara agar bagaimana metode integrity yang efisien dan juga lebih reliable.

kamu di halaman ini selama .