Decrypt Enkripsi VCLAIM v2 Dengan PHP
martinsetiawan.com. BPJS kesehatan membuat sistem bridging vclaim versi 2.0. Update bridging vclaim sangat ditunggu-tunggu oleh developer simrs yang sudah terlalu bosan dengan service vclaim v1.0, apalagi BPJS juga pasang target januari tahun depan web service vclaim versi 1 akan dimatikan. Hal ini membuat developer simrs makin bergelora.
For your information, bridging vclaim versi 1.0 dirilis sekitar tahun 2016 (mungkin), sedangkan aplikasi vclaim diperbarui setiap saat sehingga ada gap yang sangat besar antara aplikasi vclaim dengan bridging. Sampai-sampai dulu tahun 2018 ketika saya mengisi materi bridging vclaim ada yang under estimate, vclaim saja sudah versi 1.7, bridgingnya kok versi 1.
Saya sendiri maklum karena yang hadir diacara pelatihan tersebut sebagian besar bukan IT-nya, tetapi perekam medis. Kalau yang bilang orang IT kok mbangeti banget ya .
Tapi jangan senang dulu, bukan BPJS namanya kalau bridging ini mudah didevelop. Inilah kerennya BPJS, selalu memberi tantangan buat programmer rumah sakit untuk mengembangkan skillnya.
Kalau dulu jaman bridging versi 1 saya sempat terkagum-kagum dengan istilah baru seperti web services, json, cons-id, secretkey, token, expired service dll, sekarang lebih banyak lagi. Ada user key, lzstring, aes cbc pokoknya banyak hal baru yang bisa kita dapatkan dari BPJS.
Karena itu jangan mengeluh, yang penting ikuti petuah dari BPJS dan jangan lupa berdoa supaya diberi ilmu yang bermanfaat, insyaallah diberi kelancaran dalam membuat bridging vclaim, baik membuat sendiri maupun dibuatkan.
Service Baru di Vclaim v2
Banyak sekali service baru yang ada di bridging vclaim v2. Berita bagusnya, bridging vclaim v2 mendekati cara pembuatan sep di aplikasi vclaim. Berita buruknya, banyak sekali tambahan parameter yang harus dilakukan. Service yang berubah antara lain:
1. Penerbitan SEP.
Perubahan ini ada pada pembuatan, edit, hapus dan ada data induk kecelakaan di pencarian data suplesi (sampai sekarang saya belum paham tentang suplesi).
2. PRB.
Kalau tidak salah dulu sudah ada PRB, tapi entah kenapa kok saya tidak membuatnya dan baru kali ini saya membuka-buka lembaran service PRB. Semoga saja bisa dikembangkan dengan mudah.
3. Pembuatan Rujukan.
Banyak sekali service baru di pembuatan rujukan. Kalau tidak salah informasi dari mas Ghani BPJS, di versi 2.0 ini akan ada bridging pembuatan rujukan khusus yang biasa dilakukan di klinik hemodialisa. Waktu saya intip memang banyak sekali service baru yang berhubungan dengan rujukan khusus.
4. Rencana Kontrol
Service ini pasti sangat dinanti-nantikan juga ya? Soalnya service rencana kontrol sangat membantu sekali supaya nggak double entry. Seperti yang kita tahu bersama, beberapa waktu lalu BPJS meminta rumah sakit untuk mengisi admisi dan surat kontrol di aplikasi vclaim. Fitur ini katanya membantu rumah sakit, tapi menurut saya kok malah menyusahkan ya? karena kita harus entry dua kali, di aplikasi SIMRS dan aplikasi Vclaim.
Bagaimana teman-teman, menarik bukan? dengan membuat bridging vclaim versi 2.0, user sangat terbantu karena tidak perlu mengisi di dua aplikasi yang berbeda, User puas, kita yang lemas hahaha.
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:
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:
$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 vclaim v2 sangat mudah, asalkan kita menggunakan bahasa pemrograman yang lebih modern dari visual basic 6. Bukan karena visual basic 6-nya nggak mampu, tapi akunya yang nggak paham. Mungkin dibelahan bumi nan jauh disana ada seorang expert visual basic 6 yang bisa membuat enkripsi aes 256 dan lz-string? Wallahu a'lam.
Alhamdulilah akhirnya saya buat juga tutorial ini, kemarin ada beberapa teman yang meminta tapi belum sempat saya buat. Feel free to ask tentang bridging vclaim v2 ini, meskipun saya belum membuatnya saya sangat terbuka untuk berdiskusi dan belajar tentang bridging vclaim. Tetapi kalau kalian pengennya belajar tentang biologi, jangan dengan saya. Saya ada teman nih, satu tongkrongan dikelasnya istriku. dia seorang guru biologi, cocok kan kalau mau bertanya tentang biologi. Namanya teh Fira.
Beli Durian Di Jepara, Semoga Berhasil Ya.
pak, stimeStamp itu formatnya sperti apa yah? terimakasih pak.
ReplyDeleteunix time pak
Deleteom boleh liat semua file dec.php nya
ReplyDeleteItu diatas sudah ada pak, sy pakai github gist
Deleteane buat begini kenapa error yah om
Deletefunction 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);
}
$key = $ConfVclaim->consid().$ConfVclaim->secretkey().$ConfVclaim->tStamp();
$response = stringDecrypt($key);
file lengkapnya di sini om
https://pastebin.com/QTFgDSsM
errornya apa mas?
DeleteThis comment has been removed by the author.
ReplyDeleteThis comment has been removed by the author.
DeleteThis comment has been removed by the author.
ReplyDeletepak, sy udah coba kok malah ga keluar apa2 ya? jd gatau errornya dimana, kurang/salah dimananya
ReplyDeleteKalau hasilnya kosong biasanya ada kesalahan di key atau respon yg mau didecrypt kurang lengkap atau malah kelengkapen (semua respon dikirim ke decrypt)
DeleteKalau hasilnya kosong biasanya ada kesalahan di key atau respon yg mau didecrypt kurang lengkap atau malah kelengkapen (semua respon dikirim ke decrypt)
Delete.
.
kalau tau bner datanya gimana yah pak, jadi bisa dibuat kondisinya saya liat hasiil panjang string nya sama aja
Saya kurang paham apakah panjang string encode selalu sama. Kalau buntu feel free to ask lewat whatsapp pak, tapi jam kerja ya.
DeleteSaya hasilnya kenapa null ya pak gak ada pesan errornya ?
ReplyDeleteDiatas sudah sy jawab mas, biasanya kasusnya sama
DeletePHP nya versi brp ya mas
ReplyDeleteSaran saya minimal php 7 pak
Delete//Edisi bantu jawab agan_agan
ReplyDelete//cara bikin key
$stimeStamp=strval(time()-strtotime('1970-01-01 00:00:00'));
$consid="dikasih_bpjs";
$SecretKey="dikasih_bpjs";
//Tinggal Gabungin
$key="$consid$SecretKey$stimeStamp";
Terima kasih sudah dibantu mas 🙂
Deletealhamdulillah saya sudah bisa, terima kasih atas tutornya mas
ReplyDeletetetapi ada satu lgi yang ingin sya tanyakan,misal sudah dapet response dari bpjs, misal response mau saya simpan ke database gimana ya mas?
karena response dari hbis decrypt dan decompress sepertinya berbeda, saya sudah coba pakai banyak cara tetep masih blm berhasil
mohon arahannya mas
terima kasih banyak
Sudah sy jawab di whatsapp ya mas. Semoga besok service vclaim sudah lancar. Bisa langsung dicoba
Deletemantap gan
ReplyDeletematur suwun sudah mampir gan, isin aku wkwkw
Deletemaaf mas mau tanya,
ReplyDeleteapakah ada Lz-string utk PHP 5.6 ?
jujur saya belum nyoba di php 5.6 mas, apakah ada error di php 5.6
DeleteBang Martin.... saya yg sering ngerepotin di WA, menunggu tutorial INSERT SEP, mumpung dikasi perpanjangan waktu lagi sama BPJS. Semangat bang martin! Semoga sehat selalu
ReplyDeletesiap mas,sebentar lagi deh
DeleteSore Pak,.... sy ngalamin (InsertSEP) seringkali hasil dari decrypt/dekompress itu kosong / empty... tapi klo sy coba lagi tanpa merubah coding sering juga berhasil. bisa bantu pencerahan pak... berikut coding decryptnya
ReplyDelete//function key
public static function VCKeyDecrypt(){
$ppk = xppk;
$consid = xconsID;
$secretKey = xsecretKey;
$userKey = xuserKey;
// sleep(30);
date_default_timezone_set('UTC');
$tStamp = strval(time()-strtotime('1970-01-01 00:00:00'));
$keydec = $consid . $secretKey . $tStamp;
return $keydec;
}
// function decrypt
public static 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 LZString::decompressFromEncodedURIComponent($output);
// return $output;
}
ini bukan dari proses dekripsi
Deletetapi hasil response (ter-enkripsi) yang nilainya kosong
... sepertinya problem traffic
saya juga mengalami hal yang sama
... buat loop sampai dapat response yang ada nilainya
mau nanya bang biar dibuat loop, kalau request ke 1 di save di server bpjs dan responsenya kosong, atau null bakal susah juga bang kalau request ke 2 tidak di kasih data yang kita minta,,
Deletecontoh :
dalam pengambilan No SPRI, request pertama di respon null/ kosong jadi tidak ada data apapun yang di simpen ke database kita, dan kita coba request ke 2, ke 3, ke 4, dan di respon "Gagal simpan! Sudah Diterbitkan Rencana Kunjungan Kontrol/Inap Di Tanggal Yang Sama." tidak di kasih clue, berapa nomor SPRI nya, jadi gmn solusinya bang dapetin nomor SPRI nya,,, hehehehe thank bang :)
Sama ni problemnya, sekarang pakainya php 7x,
Deleteyg di decrypt response nya saja kan ya ? untuk metadatanya kan sudah aman.
dari scriptnya saya pakai $keyTimenya = time() tapi tetep tidak bisa. mungkin ada yg bisa bantu ?
script sama persis dengan yg disampaikan
Time yg dipakai harus sama dengan time yg di header. Jangan create time baru
Deletebang martin
ReplyDeleteuntuk kasus visual basic 6 ngak bisa enkripsi AES 256 mode CBC
ini masih bisa bang
caranya bikin webservice dekripsi sendiri pakai php
trus ntar dari visual basic 6 get response ke webservice
ini url info https://stackoverflow.com/questions/3757731/how-to-read-xml-from-remote-url-in-vb-net
Iya bang, cara paling mudah memang membuat aplikasi decrypt di php kemudian di consume oleh vb6 lewat xml atau winhttp. Kebetulan cara ini dy pakai di bridging eklaim
Deleteterima kasih pak untuk penjelasannya.. apakah ini bisa digunakan juga untuk ws bpjs yang antrian online? terima kasih
ReplyDeleteBisa mbak, sama saja koj
DeleteTerimaksih Penjelasannya
ReplyDeleteSangat Membantu
sama-sama pak, terima kasih sudah mampir
DeleteMisi om, untuk request data ke webservice bpjs skrg kan mesti ada variabel baru yaitu user_key, nah user_key itu kita yg generate atau emg bpjs yg terbitin ya? Soalnya kalau saya pake metode lama (sebelum pakai user_key) di alamat webservice baru hasilnya cuma kosong/null
ReplyDeleteya pak, harus pengajuan bridging vclaim v2 dulu
Deletepak maaf saya lancang mau nanya2.. punya contoh yg berhasilkah utk sep v2 nya?
ReplyDelete