Saat menggunakan protokol OAuth, Anda memerlukan string rahasia yang diperoleh dari layanan yang ingin Anda delegasikan. Jika Anda melakukan ini di aplikasi web, Anda dapat menyimpan rahasia di basis data Anda atau di sistem file, tetapi apa cara terbaik untuk menanganinya di aplikasi seluler (atau dalam hal ini aplikasi desktop)?
Menyimpan string di aplikasi jelas tidak baik, karena seseorang dapat dengan mudah menemukannya dan menyalahgunakannya.
Pendekatan lain adalah menyimpannya di server Anda, dan meminta aplikasi mengambilnya di setiap proses, tidak pernah menyimpannya di telepon. Ini hampir sama buruknya, karena Anda harus memasukkan URL ke dalam aplikasi.
Satu-satunya solusi yang bisa saya hasilkan adalah dengan terlebih dahulu mendapatkan Token Akses seperti biasa (sebaiknya menggunakan tampilan web di dalam aplikasi), dan kemudian merutekan semua komunikasi lebih lanjut melalui server kami, yang akan menambahkan rahasia ke data permintaan dan berkomunikasi dengan penyedia. Kemudian lagi, saya adalah seorang noob keamanan, jadi saya sangat ingin mendengar pendapat beberapa orang yang berpengetahuan tentang ini. Bagi saya, tampaknya tidak sebagian besar aplikasi melakukan hal ini untuk menjamin keamanan (misalnya, Facebook Connect tampaknya berasumsi bahwa Anda memasukkan rahasia ke dalam string tepat di aplikasi Anda).
Hal lain: Saya tidak percaya rahasianya terlibat dalam permintaan Token Akses pada awalnya, jadi itu bisa dilakukan tanpa melibatkan server kami sendiri. Apakah saya benar?
Jawaban:
Ya, ini adalah masalah dengan desain OAuth yang kami hadapi sendiri. Kami memilih untuk mem-proxy semua panggilan melalui server kami sendiri. OAuth tidak sepenuhnya dihapus sehubungan dengan aplikasi desktop. Tidak ada solusi yang sempurna untuk masalah yang saya temukan tanpa mengubah OAuth.
Jika Anda memikirkannya dan mengajukan pertanyaan mengapa kami memiliki rahasia, sebagian besar untuk penyediaan dan menonaktifkan aplikasi. Jika rahasia kami disusupi, penyedia hanya dapat benar-benar mencabut seluruh aplikasi. Karena kami harus menyematkan rahasia kami di aplikasi desktop, kami agak kacau.
Solusinya adalah memiliki rahasia berbeda untuk setiap aplikasi desktop. OAuth tidak membuat konsep ini mudah. Salah satu caranya adalah meminta pengguna pergi dan membuat rahasia mereka sendiri dan memasukkan kuncinya sendiri ke dalam aplikasi desktop Anda (beberapa aplikasi facebook melakukan hal serupa untuk waktu yang lama, meminta pengguna untuk pergi dan membuat facebook untuk mengatur kuis khusus mereka dan sampah). Ini bukan pengalaman yang luar biasa bagi pengguna.
Saya sedang mengerjakan proposal untuk sistem delegasi untuk OAuth. Konsepnya adalah dengan menggunakan kunci rahasia kita sendiri yang kita dapatkan dari penyedia kita, kita dapat mengeluarkan rahasia yang didelegasikan kepada klien desktop kita sendiri (satu untuk setiap aplikasi desktop pada dasarnya) dan kemudian selama proses auth kita mengirim kunci itu ke tingkat atas penyedia yang menelepon kembali kepada kami dan memvalidasi ulang dengan kami. Dengan begitu kami dapat mencabut rahasia sendiri yang kami terbitkan ke setiap klien desktop. (Meminjam banyak cara kerjanya dari SSL). Keseluruhan sistem ini akan menjadi prefek untuk layanan web bernilai tambah yang meneruskan panggilan ke layanan web pihak ketiga.
Proses ini juga dapat dilakukan tanpa callback verifikasi delegasi jika penyedia tingkat atas menyediakan API untuk membuat dan mencabut rahasia baru yang didelegasikan. Facebook melakukan hal serupa dengan mengizinkan aplikasi Facebook mengizinkan pengguna membuat sub-aplikasi.
Ada beberapa pembicaraan tentang masalah ini secara online:
http://blog.atebits.com/2009/02/fixing-oauth/ http://groups.google.com/group/twitter-development-talk/browse_thread/thread/629b03475a3d78a1/de1071bf4b820c14#de1071bf4b820c14
Solusi Twitter dan Yammer adalah solusi pin otentikasi: https://dev.twitter.com/oauth/pin-based https://www.yammer.com/api_oauth_security_addendum.html
sumber
Dengan OAUth 2.0, Anda dapat menyimpan rahasia di server. Gunakan server untuk memperoleh token akses yang kemudian Anda pindahkan ke aplikasi dan Anda dapat melakukan panggilan dari aplikasi ke sumber daya secara langsung.
Dengan OAuth 1.0 (Twitter), rahasia diperlukan untuk melakukan panggilan API. Proxying panggilan melalui server adalah satu-satunya cara untuk memastikan rahasia tidak dikompromikan.
Keduanya memerlukan beberapa mekanisme yang komponen server Anda tahu bahwa klien Anda yang memanggilnya. Ini cenderung dilakukan pada pemasangan dan menggunakan mekanisme khusus platform untuk mendapatkan semacam id aplikasi dalam panggilan ke server Anda.
(Saya adalah editor spesifikasi OAuth 2.0)
sumber
Salah satu solusinya adalah dengan kode keras rahasia OAuth ke dalam kode, tetapi tidak sebagai string biasa. Mengaburkannya dengan cara tertentu - membaginya menjadi segmen, menggeser karakter dengan offset, memutarnya - lakukan salah satu atau semua hal ini. Seorang cracker dapat menganalisis kode byte Anda dan menemukan string, tetapi kode obfuscation mungkin sulit untuk diketahui.
Ini bukan solusi yang sangat mudah, tapi yang murah.
Bergantung pada nilai exploitnya, beberapa cracker jenius dapat berusaha lebih keras untuk menemukan kode rahasia Anda. Anda perlu mempertimbangkan faktor-faktornya - biaya solusi sisi server yang disebutkan sebelumnya, insentif bagi para cracker untuk menghabiskan lebih banyak upaya dalam menemukan kode rahasia Anda, dan kerumitan kebingungan yang dapat Anda terapkan.
sumber
Jangan simpan rahasia di dalam aplikasi.
Anda harus memiliki server yang dapat diakses oleh aplikasi melalui https (tentunya) dan Anda menyimpan rahasianya di dalamnya.
Ketika seseorang ingin masuk melalui aplikasi seluler / desktop Anda, aplikasi Anda hanya akan meneruskan permintaan ke server yang kemudian akan menambahkan rahasia dan mengirimkannya ke penyedia layanan. Server Anda kemudian dapat memberi tahu aplikasi Anda apakah berhasil atau tidak.
Kemudian jika Anda perlu mendapatkan informasi sensitif dari layanan (facebook, google, twitter, dll), aplikasi meminta server Anda dan server Anda akan memberikannya ke aplikasi hanya jika terhubung dengan benar.
Sebenarnya tidak ada pilihan lain kecuali menyimpannya di server. Tidak ada di sisi klien yang aman.
Catatan
Yang mengatakan, ini hanya akan melindungi Anda dari klien jahat tetapi bukan klien dari Anda yang jahat dan bukan klien dari klien jahat lainnya (phising) ...
OAuth adalah protokol yang jauh lebih baik di browser daripada di desktop / seluler.
sumber
Ada ekstensi baru untuk Jenis Pemberian Kode Otorisasi yang disebut Kunci Bukti untuk Pertukaran Kode (PKCE) . Dengan itu, Anda tidak memerlukan rahasia klien.
dari https://oauth.net/2/pkce/
Untuk informasi lebih lanjut, Anda dapat membaca RFC 7636 lengkap atau pengantar singkat ini .
sumber
Berikut sesuatu yang perlu dipikirkan. Google menawarkan dua metode OAuth ... untuk aplikasi web, tempat Anda mendaftarkan domain dan membuat kunci unik, dan untuk aplikasi terpasang tempat Anda menggunakan kunci "anonim".
Mungkin saya menyembunyikan sesuatu dalam pembacaan, tetapi tampaknya berbagi kunci unik aplikasi web Anda dengan aplikasi yang terpasang mungkin lebih aman daripada menggunakan "anonim" dalam metode aplikasi resmi yang terpasang.
sumber
Dengan OAuth 2.0 Anda cukup menggunakan alur sisi klien untuk mendapatkan token akses dan kemudian menggunakan token akses ini untuk mengautentikasi semua permintaan lebih lanjut. Maka Anda tidak membutuhkan rahasia sama sekali.
Penjelasan yang bagus tentang bagaimana menerapkan ini dapat ditemukan di sini: https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified#mobile-apps
sumber
Saya tidak memiliki banyak pengalaman dengan OAuth - tetapi bukankah setiap permintaan tidak hanya memerlukan token akses pengguna, tetapi juga kunci dan rahasia konsumen aplikasi? Jadi, bahkan jika seseorang mencuri perangkat seluler dan mencoba menarik datanya, mereka memerlukan kunci aplikasi dan rahasia juga untuk dapat melakukan apa pun.
Saya selalu berpikir niat di balik OAuth adalah agar setiap Tom, Dick, dan Harry yang memiliki mashup tidak harus menyimpan kredensial Twitter Anda dengan jelas. Saya pikir itu menyelesaikan masalah itu dengan cukup baik meskipun ada batasannya. Juga, itu tidak benar-benar dirancang dengan memikirkan iPhone.
sumber
Saya setuju dengan Felixyz. OAuth sementara lebih baik daripada Basic Auth, masih memiliki jalan panjang untuk menjadi solusi yang baik untuk aplikasi seluler. Saya telah bermain-main dengan menggunakan OAuth untuk mengautentikasi aplikasi ponsel ke aplikasi Google App Engine. Fakta bahwa Anda tidak dapat dengan andal mengelola rahasia konsumen di perangkat seluler berarti bahwa defaultnya adalah menggunakan akses 'anonim'.
Langkah otorisasi browser penerapan Google App Engine OAuth membawa Anda ke laman yang berisi teks seperti: "Situs <some-site> meminta akses ke Akun Google Anda untuk produk yang tercantum di bawah"
YourApp (yourapp.appspot.com) - tidak berafiliasi dengan Google
dll
Ini mengambil <some-site> dari nama domain / host yang digunakan di url callback yang Anda berikan, yang bisa berupa apa saja di Android jika Anda menggunakan skema kustom untuk mencegat callback. Jadi, jika Anda menggunakan akses 'anonim' atau rahasia konsumen Anda disusupi, siapa pun dapat menyurati konsumen yang menipu pengguna agar memberikan akses ke aplikasi gae Anda.
Halaman otorisasi Google OAuth juga berisi banyak peringatan yang memiliki 3 tingkat keparahan tergantung pada apakah Anda menggunakan 'anonim', rahasia konsumen, atau kunci publik.
Hal yang cukup menakutkan bagi rata-rata pengguna yang tidak paham secara teknis. Saya tidak berharap memiliki persentase penyelesaian pendaftaran yang tinggi dengan hal-hal semacam itu.
Entri blog ini menjelaskan bagaimana rahasia konsumen tidak benar-benar berfungsi dengan aplikasi yang terpasang. http://hueniverse.com/2009/02/should-twitter-discontinue-their-basic-auth-api/
sumber
Saya juga mencoba menemukan solusi untuk otentikasi OAuth seluler, dan menyimpan rahasia dalam bundel aplikasi secara umum.
Dan ide gila baru saja menghantam saya: Ide paling sederhana adalah menyimpan rahasia di dalam biner, tetapi entah bagaimana disamarkan, atau, dengan kata lain, Anda menyimpan rahasia terenkripsi. Jadi, itu berarti Anda harus menyimpan kunci untuk mendekripsi rahasia Anda, yang tampaknya telah membawa kami pada lingkaran penuh. Namun, mengapa tidak menggunakan kunci yang sudah ada di OS, yaitu ditentukan oleh OS bukan oleh aplikasi Anda.
Jadi, untuk memperjelas ide saya adalah Anda memilih string yang ditentukan oleh OS, tidak masalah yang mana. Kemudian enkripsi rahasia Anda menggunakan string ini sebagai kuncinya, dan simpan di aplikasi Anda. Kemudian selama runtime, dekripsi variabel menggunakan kunci, yang hanya merupakan konstanta OS. Setiap peretas yang mengintip biner Anda akan melihat string terenkripsi, tetapi tidak ada kunci.
Apakah itu akan berhasil?
sumber
Di sini saya punya jawaban tentang cara aman untuk menyimpan informasi oAuth Anda di aplikasi seluler
https://stackoverflow.com/a/17359809/998483
https://sites.google.com/site/greateindiaclub/mobil-apps/ios/securelystoringoauthkeysiniosapplication
sumber
Facebook tidak menerapkan OAuth secara tegas (belum), tetapi mereka telah menerapkan cara bagi Anda untuk tidak menyematkan rahasia Anda di aplikasi iPhone: https://web.archive.org/web/20091223092924/http://wiki. developers.facebook.com/index.php/Session_Proxy
Adapun OAuth, ya, semakin saya memikirkannya, kami agak kenyang. Mungkin ini akan memperbaikinya.
sumber
Tak satu pun dari solusi ini mencegah peretas yang ditentukan untuk mengendus paket yang dikirim dari perangkat seluler (atau emulator) mereka untuk melihat rahasia klien di header http.
Salah satu solusinya adalah memiliki rahasia dinamis yang terdiri dari stempel waktu yang dienkripsi dengan kunci & algoritme enkripsi 2 arah pribadi. Layanan kemudian mendekripsi rahasia dan menentukan apakah stempel waktunya +/- 5 menit.
Dengan cara ini, bahkan jika rahasianya dikompromikan, peretas hanya akan dapat menggunakannya selama maksimal 5 menit.
sumber
Seperti yang telah disebutkan orang lain, seharusnya tidak ada masalah nyata dengan menyimpan rahasia secara lokal di perangkat.
Selain itu, Anda selalu dapat mengandalkan model keamanan Android berbasis UNIX: hanya aplikasi Anda yang dapat mengakses apa yang Anda tulis ke sistem file. Cukup tulis infonya ke objek SharedPreferences default aplikasi Anda.
Untuk mendapatkan rahasianya, seseorang harus mendapatkan akses root ke ponsel Android.
sumber