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:

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 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.


 

 






47 comments for "Decrypt Enkripsi VCLAIM v2 Dengan PHP"

  1. pak, stimeStamp itu formatnya sperti apa yah? terimakasih pak.

    ReplyDelete
  2. om boleh liat semua file dec.php nya

    ReplyDelete
    Replies
    1. Itu diatas sudah ada pak, sy pakai github gist

      Delete
    2. ane buat begini kenapa error yah om

      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);
      }

      $key = $ConfVclaim->consid().$ConfVclaim->secretkey().$ConfVclaim->tStamp();
      $response = stringDecrypt($key);

      file lengkapnya di sini om
      https://pastebin.com/QTFgDSsM

      Delete
  3. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. This comment has been removed by the author.

      Delete
  4. This comment has been removed by the author.

    ReplyDelete
  5. pak, sy udah coba kok malah ga keluar apa2 ya? jd gatau errornya dimana, kurang/salah dimananya

    ReplyDelete
    Replies
    1. Kalau hasilnya kosong biasanya ada kesalahan di key atau respon yg mau didecrypt kurang lengkap atau malah kelengkapen (semua respon dikirim ke decrypt)

      Delete
    2. Kalau hasilnya kosong biasanya ada kesalahan di key atau respon yg mau didecrypt kurang lengkap atau malah kelengkapen (semua respon dikirim ke decrypt)
      .
      .
      kalau tau bner datanya gimana yah pak, jadi bisa dibuat kondisinya saya liat hasiil panjang string nya sama aja

      Delete
    3. Saya kurang paham apakah panjang string encode selalu sama. Kalau buntu feel free to ask lewat whatsapp pak, tapi jam kerja ya.

      Delete
  6. Saya hasilnya kenapa null ya pak gak ada pesan errornya ?

    ReplyDelete
  7. //Edisi bantu jawab agan_agan
    //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";


    ReplyDelete
  8. alhamdulillah saya sudah bisa, terima kasih atas tutornya mas

    tetapi 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

    ReplyDelete
    Replies
    1. Sudah sy jawab di whatsapp ya mas. Semoga besok service vclaim sudah lancar. Bisa langsung dicoba

      Delete
  9. maaf mas mau tanya,
    apakah ada Lz-string utk PHP 5.6 ?

    ReplyDelete
    Replies
    1. jujur saya belum nyoba di php 5.6 mas, apakah ada error di php 5.6

      Delete
  10. Bang Martin.... saya yg sering ngerepotin di WA, menunggu tutorial INSERT SEP, mumpung dikasi perpanjangan waktu lagi sama BPJS. Semangat bang martin! Semoga sehat selalu

    ReplyDelete
  11. Sore 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


    //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;
    }

    ReplyDelete
    Replies
    1. ini bukan dari proses dekripsi
      tapi hasil response (ter-enkripsi) yang nilainya kosong
      ... sepertinya problem traffic
      saya juga mengalami hal yang sama
      ... buat loop sampai dapat response yang ada nilainya

      Delete
    2. 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,,

      contoh :
      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 :)

      Delete
    3. Sama ni problemnya, sekarang pakainya php 7x,

      yg 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

      Delete
    4. Time yg dipakai harus sama dengan time yg di header. Jangan create time baru

      Delete
  12. bang martin
    untuk 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

    ReplyDelete
    Replies
    1. 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

      Delete
  13. terima kasih pak untuk penjelasannya.. apakah ini bisa digunakan juga untuk ws bpjs yang antrian online? terima kasih

    ReplyDelete
  14. Terimaksih Penjelasannya
    Sangat Membantu

    ReplyDelete
  15. Misi 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

    ReplyDelete
  16. pak maaf saya lancang mau nanya2.. punya contoh yg berhasilkah utk sep v2 nya?

    ReplyDelete
  17. This is really interesting, You’re a very skilled blogger. Keep it up for good post

    ReplyDelete
  18. Found this interesting post to read. I really enjoy it!! Pretty great article

    ReplyDelete
  19. Wonderful job. I really enjoyed this blog of yours, Too cool to have like this

    ReplyDelete
  20. Hey pretty!! Thanks for posting, You have great blog here. keep it up

    ReplyDelete

Post a Comment