Jumat, 24 September 2010 | By: kiri.the.punk

Algoritma Membuat koneksi jabber menggunakan SASL (Simple Authentication Security Layer)

dear all,
pada kesempatan kali ini aku pengen share cara merancang koneksi SASL untuk login ke server jabber.
sebenarnya model layer security itu banyak, adapun model authentication yg populer biasanya menggunakan Plain dan Digest-MD5.
Plain biasa digunakan untuk server jabber kelas pemula dengan ketersedian App client pendukung yg sederhana
Dan DIgest-MD5 biasa digunakan pada server2 jabber kelas menengah keatas :)
Dasar autentikasi menggunakan Digest-MD5 adalah penggabungan beberapa string yang di convert kedalam Base64 String (untuk hal ini kalian bisa cari referensinya di wikipedia). Diantara deret string itu terdapat string lain berupa konversi dari MD5 (Message Digest Algorithm 5).
OK untuk mempermudah silahkan pelajari algoritma dibawah ini. dan untuk praktek programming kalian bisa menggunakan bahasa pemrograman berbasis Dotnet Framework. Kenapa dotnet karena dotnet salah satu framework yang sangat lengkap fungsi2 pendukungnya menyangkut security layer dan Cryptography.
asumsi kita akan melakukan testing koneksi Digest-MD5 dengan menggunakan username = testingjabber dan password = testingjabberok
ketika awal koneksi ke server jabber pada baris message ke 2 kembalian pesan dari server akan muncul tag stream seperti ini
PLAINDIGEST-MD5http://jabber.org/features/iq-register" />
pada pembahasan kali ini aku tidak coba membahas tentang TLS (Transport Layer Security) atau bisa dikatakan socket bilamana melakukan pengiriman data, maka terlebih dahulu data tersebut akan dienkripsi, TLS mirip dengan SSL (Secure Socket Layer mode) hanya saja berjalan pada port umum bercampur dengan koneksi non TLS/SSL. TLS socket ini lebih advance dan cukup rumit, dilain waktu akan aku bahas juga :) so koneksi SASL akan berhasil bilamana mode TLS tidak required, bila reqired maka login SASL tidak berhasil :) namun jangan kecil hati dulu karena kebanyakan koneksi jabber mengabaikan mode TLS, artinya boleh dipakai atau tidak :)
jika kita simak tag diatas maka disitu tercantum mekanisme koneksi SASL

dan lihat subdetailnya terdapat PLAIN dan DIGEST-MD5
artinya server mengijinkan client untuk melakukan login menggunakan mekanisme PLAIN dan MD5 tersebut (pilih salah 1).
hal yang harus dilakukan oleh client jabber adalah merequest mekanisme tersebut dengan menjawab dengan tag ini

kemudian tunggu sejenak, lalu server akan membalas dengan tag ini
bm9uY2U9IjI0NTE4NDAwODYiLHFvcD0iYXV0aCIsY2hhcnNldD11dGYtOCxhbGdvcml0aG09bWQ1LXNlc3M=
bila base64 string "bm9uY2U9IjI0NTE4NDAwODYiLHFvcD0iYXV0aCIsY2hhcnNldD11dGYtOCxhbGdvcml0aG09bWQ1LXNlc3M=" kita decode menjadi string artinya adalah nonce="2451840086",qop="auth",charset=utf-8,algorithm=md5-sess
dari deret string itu yang perlu kalian ambil adalah bagian nonce saja yang nanti akan digabung kedalam final string untuk merespon login account kita ke server
selanjutkan kita membalas challenge base64 string diatas dengan response seperti dibawah ini
dXNlcm5hbWU9InRlc3RpbmdqYWJiZXIiLHJlYWxtPSIiLG5vbmNlPSIyNDUxODQwMDg2Iixjbm9uY2U9IjQxODBiNTEyMGNhMmUwOWVhYTNiZDJlYmY0YjUzNjY3IixuYz0wMDAwMDAwMSxxb3A9YXV0aCxkaWdlc3QtdXJpPSJ4bXBwL25pbWJ1enouY29tIixjaGFyc2V0PXV0Zi04LHJlc3BvbnNlPWJkMmY3ODEzZmZmYzkyYWUxMjdmY2I4OTZhN2EzZTlh
bila base64string "dXNlcm5hbWU9InRlc3RpbmdqYWJiZXIiLHJlYWxtPSIiLG5vbmNlPSIyNDUxODQwMDg2Iixjbm9uY2U9IjQxODBiNTEyMGNhMmUwOWVhYTNiZDJlYmY0YjUzNjY3IixuYz0wMDAwMDAwMSxxb3A9YXV0aCxkaWdlc3QtdXJpPSJ4bXBwL25pbWJ1enouY29tIixjaGFyc2V0PXV0Zi04LHJlc3BvbnNlPWJkMmY3ODEzZmZmYzkyYWUxMjdmY2I4OTZhN2EzZTlh " ini diterjemakan kedalam string artinya adalah :
username="testingjabber",realm="",nonce="2451840086",cnonce="4180b5120ca2e09eaa3bd2ebf4b53667",nc=00000001,qop=auth,digest-uri="xmpp/nimbuzz.com",charset=utf-8,response=bd2f7813fffc92ae127fcb896a7a3e9a
simak terjemahannya kedalam string bahwa gabungan dari respon base64 string yg kita kirim itu terdiri dari
username kita yaitu testingjabber
kemudian realm (khusus realm ini biasanya kosong atau sebenarnya diisi nama server tersebut misal nimbuzz.com atau jabber.org dll, hanya kebanyakan server jabber menginginkan realm ini dikosongkan atau string kosong saja)
setelah realm ada nonce, dimana nonce diambil dari deret string challenge dari server diatas
setelah itu ada cnonce, nilai ini diambil dari random uniqid, untuk memudahkannya gunakan fungsi GUID pada dotnet atau juga bisa dilihat dari GUID SQL server, dan semacamnya, dengan membuang tanda { } dan di konversi ke string lower case variant
kemudian nc selalu diisi dengan 00000001, kenapa demikian karena yg koneksi ketika itu tidak koneksi masal sekaligun satu challenge dan satu respons melainkan hanya 1 koneksi account saja sehingga cukup buat format diatas dengan akhiran 1 yg menandakan bahwa jumlah client yng merespon koneksi saat itu hanya 1 account saja.
kemudian ada qop akan selalu diisi dengan "auth"
kemudian digest-uri merupakan gabungan string xmpp ditambah tanda "/" dan nama server yg kita tuju misal nimbuzz.com
lalu ada charset yg selalu diisi dengan utf-8 (default, namun bisa diisi dengan tipe charset lain selama diijinkan oleh server tujuan)
terakhir hal yg paling penting adalah response menjadi bd2f7813fffc92ae127fcb896a7a3e9a.
ok. silahkan pahami dulu tiap baris, selanjutnya kita akan masuk pada sesi pembahasan, yaitu merancang response yg aku katakan sebagai string yg paling penting guna keberhasilan respon login SASL ini.
pertanyaannya, dari mana asal isi string response itu ?
jawab:
setelah proses penterjemahan challenge diatas dari base64string kedalam string, lalu ambil keyname nonce dan itemstringnya (isinya)
lalu diproses bersama sama dengan usernama dan password kamu dalam beberapa pase, sebagai berikut :
1. Gabungkan usernama:realm:password kedalam 1 string contoh seperti ini "testingjabber::testingjaberok", lihat bahwa realm tidak diisi ketika koneksi ke nimbuzz sehingga muncul nya hanya :: artinya diantara tanda : dan : ada realm namun kosong. Mungkin saja keserver lain tidak seperti itu tetapi harus mengisi nama servernya, namun demikian beberapa uji coba aku ke server2 jabber ternyata tidak membutuhkan realm tersebut so format stringnya persis seperti yang aku sajikan diatas :)
2. terjemahkan kedalam variable type array byte
3. lalu compute hash ke MD5 dalam variable type array byte (point penting, bila menggunakan dotnet hal ini mudah dilakukan)
4. strng nonce yg sudah dipisahkan tadi lalu digabungkan dengan cnonce dengan format nonce:cnonce (ingat diisi dengan isinya bukan variablenya).
5. Lalu terjemahkan kedalam variable type array byte
6. hasil point 3 dan 5 kemudian digabungkan lagi kedalam result type array byte, letakkan hasil point 3 didepan dan point 5 mengikuti dibelakangnya.
7. terjemahkan digest-uri yg kita dapat dari penggabungan string xmpp "/" nimbuzz.com menjadi "xmpp/nimbuzz.com" kedalam variable type byte
8. hasil dari point 6 di compute hash lagi menggunakan MD5 begitu juga hasil dari point 7 dicompute hash menggunakan MD5 (ingat 2 bagian ini terpisah tidak digabung) tampung 2 proses itu masing2 kedalam 2 variable string yg berbeda
9. lalu hasil dari 2 string dari point 8 di gabungkan kedalam 1 string baru dengan format = isi hasilstring1:isi nonce:"00000001":isi cnonce:"auth":isi hasilstring2
10. tampung hasil point 9 kedalam variable type array byte
11. hasil point 10 di compute hash menggunakan MD5 dan tampung kedalam variable array byte
12. hasil point 11 diterjemahkan kedalam base64 string dan tampung kedalam variable string
13. kemudian rangkai point 12 bersama dengan beberapa variable string lain menjadi satu rangkaian string baru dengan format sbb :
username="testingjabber", realm="", nonce="2451840086", cnonce="4180b5120ca2e09eaa3bd2ebf4b53667", nc=00000001, qop=auth, digest-uri="xmpp/nimbuzz.com", charset=utf-8, response=bd2f7813fffc92ae127fcb896a7a3e9a hasil diatas merupakan hasil final proses penterjemahan dari beberapa point proses diatas dan merupakan contoh kongkrit berdasarkan account username = testingjabber password=testingjabberok
14. tampung hasil point 13 kedalam variable array byte
15. terakhir konversikan kedalam base64 string dan tampung kedalam variable tipe string
16. hasil point 15 ini kemudian dikirim bersama dengan tag response menjadi 1 rangkaian message response menjadi
dXNlcm5hbWU9InRlc3RpbmdqYWJiZXIiLHJlYWxtPSIiLG5vbmNlPSIyNDUxODQwMDg2Iixjbm9uY2U9IjQxODBiNTEyMGNhMmUwOWVhYTNiZDJlYmY0YjUzNjY3IixuYz0wMDAwMDAwMSxxb3A9YXV0aCxkaWdlc3QtdXJpPSJ4bXBwL25pbWJ1enouY29tIixjaGFyc2V0PXV0Zi04LHJlc3BvbnNlPWJkMmY3ODEzZmZmYzkyYWUxMjdmY2I4OTZhN2EzZTlh
17. bila login berhasil maka akan ada balasan dari server seperti ini :
­
selanjutnya client akan membuka stream baru dan seterusnya dan seterusnya :)
Catatan :
pada bagian response seperti ini response=bd2f7813fffc92ae127fcb896a7a3e9a, hasil nya akan selalu random namun tetap memberi pengertian yg sama yaitu terdiri dari username password realm nonce dan cnonce
Untuk saat ini ulasan diatas sudah aku terapkan di Aplikasi Chating Warrior aku yg terbaru, dan aku bercita-cita menciptakan 1 aplikasi chating khusus jabber untuk teman2, mungkin suatu saat akan aku publish :) dan jangan kawatir chating warrior tersebut banyak sekali menyajikan beberapa berbedaan dengan beberapa aplikasi chating lain yang ada, karena ini aplikasi chating untuk perang bukan aplikasi chating untuk KUJUM :lol:
selamat mencoba, semoga anda menjadi programmer jabber yg handal.
untuk detail proses login menggunakan SASL, atau bahkan ingin sekaligus menggunakan socket mode TLS
silahkan baca referensi pendukungnya di http://xmpp.org/rfcs/rfc3920.html
Good luck !!!!!!

0 komentar:

Posting Komentar