Senin, 08 Agustus 2022

Decrypt Enkripsi pCare v4 Dengan PHP

 BPJS kesehatan membuat sistem bridging pCare versi 4.0. Update bridging pCare sangat ditunggu-tunggu oleh developer bridging pCare SIMPUS , apalagi BPJS juga pasang target januari tahun depan web service pCare versi 3 akan dimatikan. Hal ini membuat developer SIMPUS makin bersemangat. 

Ada beberapa perubahan parameter header dan juga penambahan encript dan decript.

Enkripsi dan Kompresi String

Entah apakah memang sudah jadi roadmap BPJS atau karena kasus yang sempat muncul kemarin. Meskipun kita tidak tahu apakah datanya memang bocor dari BPJS atau bukan, yang pasti sih bukan dari web service yang dikonsumsi oleh rumah sakit, soalnya saya tidak menemukan format data seperti yang ramai di internet. 

Sebenarnya update ini sangat bagus, saya sangat mendukung. Tapi mbok ya pakai enkripsi yang bisa dibuat dengan bahasa pemrograman visual basic 6 😭. gini-gini pemakai visual basic 6 masih banyak lho!

Saya sadar, meskipun termasuk bahasa yang canggih pada masanya, visual basic 6 adalah bahasa pemrograman dari 23 tahun yang lalu. Saya tidak memaksa, hanya berharap. Kalau tidak bisa ya tidak apa-apa, kita mah nurut sama BPJS, wong nuntut juga nggak bisa, siapa elu 😆.

 AES 256 mode CBC

dimasa kini, AES 256 sudah sangat jamak digunakan dalam enkripsi. Hampir semua bahasa pemrograman modern sudah punya library atau fungsi build in, tapi tidak dengan visual basic 6. Jaman segitu enkripsi sepertinya belum populer, buktinya dosen saya tidak mengajarkan. Saat ini enkripsi data seakan sudah menjadi hal wajib dalam pertukaran data lewat internet. Chattingan whatsapp dan telegram saja dienkripsi, masak data penting nggak dienkripsi?

Lz-string

Lz-string adalah tehnik kompresi data yang dikembangkan untuk javascript. dengan lz-string, data menjadi lebih kecil dan bisa disimpan di local storage berkapasitas kecil tanpa khawatir storagenya meledak. Contoh penerapannya adalah di aplikasi untuk perangkat mobile (handphone).

Contekan Dari IT BPJS

Sebenarnya IT BPJS sudah memberikan contoh beberapa bahasa pemrograman yang bisa langsung kita salin. Supaya sesuai dengan judul, saya mencontohkan kodingan yang saya dapat dari aplikasi trust-mark BPJS Kesehatan. Aplikasi trust-mark adalah aplikasi katalog web service dari BPJS. Berikut ini kodingnya:

<?php 
        require_once 'vendor/autoload.php';
    
        /* function decrypt dan kompresi dijadikan satu */       
        function stringDecrypt($key, $string)
	{

		$encrypt_method = 'AES-256-CBC';
		// hash
		$key_hash = hex2bin(hash('sha256', $key));
		// iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning        
		$iv = substr(hex2bin(hash('sha256', $key)), 0, 16);
		$output = openssl_decrypt(base64_decode($string), $encrypt_method, $key_hash, OPENSSL_RAW_DATA, $iv);
		return \LZCompressor\LZString::decompressFromEncodedURIComponent($output);
	}
?>

Alhamdulilah ya, tim IT BPJS baik sekali, kita tidak perlu bersusah payah mencari kodingannya. Tapi kok nggak ada yang visual basic 6 sih pak? hahaha ngarep lagi nih 😓. 

Setelah di salin, coba jalankan aplikasinya! Dan, deng dong keluar error ya? kalau nggak keluar error berarti sakti. Soalnya librarynya kan belum diinstall. 

Install Library LZ-String

untuk menginstall library lz-string, kita harus menginstall composer terlebih dahulu. Sebenarnya tanpa composer juga bisa, tetapi lebih ribet. Selain itu seorang murid itu harus taat pada gurunya. Karena itu saya mengikuti cara yang ada ditutorial, meskipun tidak dijelaskan secara eksplisit, melihat ada folder vendor, saya menduga bahwa tim IT BPJS menggunakan compresor, eh composer. 

Cara menginstall lz-string dengan composer sangat mudah. Saya menggunakan teks editor visual code yang sangat membantu sekali, soalnya disitu kita bisa mengakses command prompt secara langsung. Fitur ini bernama "terminal", seperti nama command prompt di linux ya, saya jadi merasa keren.

buka terminal di visual code, lalu masukkan perintah dibawah ini kemudian tekan enter:

composer require nullpunkt/lz-string-php

tunggu beberapa saat sampai prosesnya selesai. Setelah itu akan kita dapati folder vendor, file composer.json dan  composer.lock.

 

file dec.php bukan dari composer ya. file dec.php adalah file php buatan saya yang berisi salinan source code contoh dari BPJS.

Key Dekripsi dan Respon terenkripsi

AES 256 menggunakan key untuk proses enkripsi dan dekripsinya. Key yang digunakan adalah perpaduan dari "consid + conspwd + timestamp request (concatenate string)". Bingung nggak? nggak usah bingung, cara bikinnya gampang kok, kalau di bahasa pemrograman PHP hanya seperti ini:

$key = cons_id.secretkey.stimeStamp;

note: respon yang didecrypt hanya respon yang dienkripsi saja. Jangan memasukkan semua respon ke decryptor. Kemudian copy pesan dari awal sampai akhir (biasanya ditandai dengan "==") .

Sekarang balik lagi ke contoh source code dari IT BPJS diatas, perhatikan baris kelima yang berisi:

function stringDecrypt($key, $string){

$key adalah kunci dekripsi seperti yang saya tulis diatas, sedangkan string adalah respon dari web service BPJS yang akan didekripsi.

Proses Dekripsi dan Dekompresi

Untuk menjadikan respon dari web service Vclaim menjadi sesuatu yang bisa kita baca adalah dengan mendekrypt dan dekompresi. Ada beberapa teman pernah curhat, sudah mengikuti petuah dari BPJS kok masih gagal mendecrypt datanya.

Sebenarnya dia sudah berhasil mendecrypt data, tetapi dia melupakan satu hal. Selain didecrypt, data tersebut harus didekompres. 

Fungsi decrypt ada di baris ke-5, sedangkan fungsi dekompresi ada di baris 23. maka urutannya adalah :

1. Decrypt response web service Vclaim dengan key yang kita punya.

2. Dekompresi 

Kesimpulan

Sebenarnya cara mendecrypt dan dekompresi data dari bridging pCare v.4 bisa dilakukan dengan mudah. Asalkan telaten dan sabar dalam proses. Semoga berhasil...

sumber :

https://www.martinsetiawan.com/2021/11/decrypt-enkripsi-vclaim-v2-dengan-php.html