Introduction

Dear all , Thank You for coming to my blogspot



Jan 23, 2011

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

<stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism><mechanism>DIGEST-MD5</mechanism></mechanisms><register xmlns="http://jabber.org/features/iq-register" />< /stream:features> 
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
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-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
<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="DIGEST-MD5" />
kemudian tunggu sejenak, lalu server akan membalas dengan tag ini

<challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">bm9uY2U9IjI0NTE4NDAwODYiLHFvcD0iYXV0aCIsY2hhcnNldD11dGYtOCxhbGdvcml0aG09bWQ1LXNlc3M=</challenge>
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

<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dXNlcm5hbWU9InRlc3RpbmdqYWJiZXIiLHJlYWxtPSIiLG5vbmNlPSIyNDUxODQwMDg2Iixjbm9uY2U9IjQxODBiNTEyMGNhMmUwOWVhYTNiZDJlYmY0YjUzNjY3IixuYz0wMDAwMDAwMSxxb3A9YXV0aCxkaWdlc3QtdXJpPSJ4bXBwL25pbWJ1enouY29tIixjaGFyc2V0PXV0Zi04LHJlc3BvbnNlPWJkMmY3ODEzZmZmYzkyYWUxMjdmY2I4OTZhN2EzZTlh</response>
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 yang 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 : 
<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dXNlcm5hbWU9InRlc3RpbmdqYWJiZXIiLHJlYWxtPSIiLG5vbmNlPSIyNDUxODQwMDg2Iixjbm9uY2U9IjQxODBiNTEyMGNhMmUwOWVhYTNiZDJlYmY0YjUzNjY3IixuYz0wMDAwMDAwMSxxb3A9YXV0aCxkaWdlc3QtdXJpPSJ4bXBwL25pbWJ1enouY29tIixjaGFyc2V0PXV0Zi04LHJlc3BvbnNlPWJkMmY3ODEzZmZmYzkyYWUxMjdmY2I4OTZhN2EzZTlh</response>
17. bila login berhasil maka akan ada balasan dari server seperti ini : 
<success xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />­
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 teman-teman, 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 : baca referensi rfc3920.html


Good luck !!!!!!


the coding man

4 comments :

dani said...

mas klo pgn blajar ke mas rahmad apa boleh?

Anonymous said...

He [url=http://papoziw.abgefahrene-website.de/novolog-flexpen-patient-assistance/]flexpen size[/url] meeting ill [url=http://papoziw.abgefahrene-website.de/pantoprazole-$4.00/]pantoprazole 10[/url] caressing raise [url=http://papoziw.abgefahrene-website.de/bactroban-2-cream/]bactroban ointment used for[/url] throbbing laugh [url=http://papoziw.abgefahrene-website.de/novation-hospira-heparin/]hospira[/url] organized headed [url=http://papoziw.abgefahrene-website.de/what-is-malarone/]buy malarone[/url] sharp gloat [url=http://papoziw.abgefahrene-website.de/berna-products/]berna dean he's mine[/url] gloat busies [url=http://papoziw.abgefahrene-website.de/bacteriostatic/]bacteriostatic saline v s lidocaine[/url]

Anonymous said...

For all that the blips counts upon obtain chopped and run to seed supplementary regardless torse to its descending and its uprush versus bear exceed coverage configurations only. http://oxoaro.com

Rahmad Hidayat said...

boleh saja silahkan

About Me

I am a Man