Flat Token Authentication
Latar belakang
Saat ini saya tengah mengembangkan sebuah API(REST API) untuk moderasi konten digital seperti pada website, forum, dan sebagainya. Namun saya sadar bahwa keamanan(security) adalah hal yang amat penting dan krusial bagi semua pihak.
Akhirnya saya mulai mempelajari mekanisme security yang ada dan sudah umum di gunakan untuk API, hinggal akhirnya saya menemukan OAuth 1 dan OAuth 2. Pada saat ini OAuth 2 masih berupa draft dan belum resmi, namun kita bisa mempelajari konsepnya. Setelah membandingkan dan mencoba sendiri security OAuth 2, ternyata menurut saya tidak aman karena token bisa digunakan dimanapun dan berkali-kali. Kelebihan OAuth 2 adalah tidak begitu kompleks dan rumit seperti OAuth 1, namun seperti yang sudah saya jelaskan sebelumnya bahwa OAuth 2 masih berupa draft dan tidak aman(saya sudah membuktikannya). Anda bisa membaca link ini sebagai bahan bacaan dan pertimbangan tambahan http://hueniverse.com/2012/07/oauth-2-0-and-the-road-to-hell/
Sedangkan untuk OAuth 1, saya sudah mencoba dan memang cukup secure secara konsep dan implementasinya dan juga sudah dipakai oleh industry selama ini. Namun perlu diingat bahwa OAuth 1 dan OAuth 2 pada awalnya dirancang untuk konsep 3 Legged connection. Sehingga token akan menjadi sia-sia jika anda menggunakan konsep 2 legged. Bukan berarti OAuth 1 tidak mensuport 2 legged connection, namun hal ini akan sangat over kill. Jika anda menggunakan OAuth 1, pasti anda akan merasakan betapa kompleksnya aturan-aturan yang ada. Saya juga sudah mencoba beberapa OAuth library(official), dan saya cukup kaget ketika menemukan bugs yang hampir ada di semua library yang saya coba, yaitu bugs untuk Array of Array, dimana jika ditemukan variable seperti(Array of Array) ini maka pasti tidak akan masuk kedalam base string yang akan di generate sebagai signature. Ini merupakan bug yang sangat fatal. Saya heran kenapa bug ini tidak ada yang sadar dan membenarkannya dari awal OAuth ada(2008). Anda bisa lihat http://code.google.com/p/oauth-php/issues/detail?id=131
Namun sejauh ini memang OAuth 1 masih menjadi yang terbaik dan terbukti secara industry, aman dari banyak jenis serangan dan security issue, serta bisa digunakan pada HTTP(tidak membutuhkan SSL). Perlu anda ketahui saya menghabiskan waktu hampir 5 hari untuk mengerti konsep OAuth, dikarenakan saya mempelajari dari semua sudut, seperti konsep, security, Code dan implementasinya.
Saya merasa OAuth sangat terlalu kompleks untuk 2 legged connection dan mungkin ada solusi yang lebih mudah dan secure. Oleh karena itu saya menghabiskan waktu 2 hari untuk memikirkan alternative dan cara yang paling cocok untuk mekanisme 2 legged.
Masalah
OAuth 1 sangat kompleks untuk mekanisme 2 legged
Tujuan Penulisan
Karena melihat permasalahan yang ada, maka saya merancang konsep Flat Token Authentication dengan harapan tidak kompleks namun secure.
Pembatasan Masalah
Kali ini masalah akan dibatasi seputar konsep, keamanan dan kelayakan pada metode Flat Token Authentication. Serta konsep akan dibatasi hanya untuk 2 legged connection. Namun tidak menutup kemungkinan konsep ini bisa digunakan pada 3 legged atau n legged connection.
Catatan Awal
Sekali lagi saya ingin menyatakan bahwa tujuan saya adalah mencari alternative, dan meminta bantuan public untuk menilai dan memberikan masukan untuk solusi yang saya rancang, apakah layak atau tidak.
2 Legged Connection
Spec
- API Server must use SSL
- Public Key and Private Key
- One Way Hash using SHA512
- Token Signature using HMAC(SHA512 and Private Key)
- One Time Token Expire
Untuk memangkas kompleksitas pada OAuth 1, serta memberikan level security maka API Server harus menggunakan SSL.
Konsep Flat Token Authentication membagi akses client terharap server menjadi dua bagian.
1. Client mengirimkan data atau action/perintah terhadap server (Contoh : client memberikan perintah untuk menghapus salah satu data user.)
2. Client meminta data dari server (Contoh : Client meminta data semua usernya.)
Karena menggunakan SSL, maka bisa dijamin koneksi dari Client ke Server tidak bisa di spoof. Namun tidak sebaliknya jika Server yang memulai koneksi ke client.
Client dan Server harus memiliki Public key dan Private key. Private key haruslah rahasia dan hanya di ketahui oleh Server dan Client. Sedangkan Public key bisa di ketahui oleh siapa saja.
Untuk hash pada saat verifikasi token, diharuskan menggunakan sha512.
Penandatanganan hanya dilakukan terhadap TOKEN yang di kirim oleh server ke Client. Konsep Flat Token Authentication tidak mengenal data signature karena sudah menggunakan SSL.
Skenario 1, Client mengirimkan data :
- [Client] mengirim data user barunya terhadap [Server]
- [Server] membalas dengan sebuah random token yang akan expire jika token tersebut sudah di konfirmasi oleh [Client]. Pada saat ini Server tidak akan menyimpan data user sebelum [Client] melakukan konfirmasi. Jika konfirmasi berhasil maupun gagal, maka token akan dibuang dan tidak dapat digunakan lagi oleh pihak manapun.
- [Client] harus melakukan konfirmasi dengan cara menandatangani token tersebut dengan HMAC menggunakan Private Key yang dimiliki, lalu mengirimkannya ke [Server].
- [Server] menerima signature baru tersebut dan mengeceknya dengan cara yang sama, yaitu menandatangani dengan cara HMAC(SHA512) menggunakan Private key. Jika valid, maka data user akan dimasukkan, jika tidak maka bisa dipastikan request data user tersebut dilakukan oleh Attacker.
Perlu diketahui bahwa point 1 dan 2 terlindungi dari penyadapan karena melalui HTTPS. Namun yang menjadi permasalahan adalah Penyerang bisa saja mengetahui public key dan melakukan request terhadap server. Oleh karena itu Server mengirimkan token dan seakan-akan mempercayai data yang dikirim tersebut. Namun tentunya Penyerang tidak bisa melakukan konfirmasi karena tidak mengetahui Private Key. Mari lihat Ilustrasi dibawah ini
Skenario 2, Client meminta data :
- [Client] meminta data semua Usernya ke [Server]
- [Server] membalas dengan sebuah token yang akan ditukar dengan data jika sudah di konfirmasi oleh [Client].
- [Client] menandatangani token tersebut dengan HMAC(SHA512) menggunakan Private Key yang dimilikinya dan mengimkan konfirmasi tersebut ke [Server].
- [Server] menerima konfirmasi tersebut dan melakukan pengecekan dengan cara yang sama, yaitu tandangan token dengan HMAC(SHA512) menggunakan Private Key, jika sama maka [Server] akan membalas dengan Data yang diminta. Setelah itu token pasti akan expire.
Dengan konsep yang sama, yaitu Server menahan untuk memberikan data, dan hanya memberikan token. Jika token berhasil di konfirmasi, maka token itu bisa ditukan dengan data yang diminta. Semua koneksi aman dari penyadapan dan pengubahan data karena melalui HTTPS.
Kekurangan utama dari system ini adalah dibutuhkan +1 connection or API Call untuk konfirmasi token. Namun hal ini sebanding dengan pengurangan drastis dari kerumitan ketika menggunakan OAuth v1.
Saya mohon lihat dan teliti segala celah. Masukan akan sangat berarti bagi saya untuk bisa memperbaiki konsep ini. Jika ternyata konsep ini tidak layak maka saya akan senang hati J. Jika anda tertarik untuk mengembangkannya bersama saya, maka kita bisa membuat working group seperti apa yang dilakukan OAuth selama ini.
Feedback bisa dikirimkan langsung pada comment di blog ini atau email ke ahmadfathihadi [ at ] gmail.com dan cc ke ahmad [ at ] tandif.com.
Saya bisa dihubungi di +62 81 808 49 7749




















