Menyimpan data rahasia dengan aman di aplikasi web sisi klien

11

Saya memiliki aplikasi web ini yang akan menjadi semua teknologi sisi klien (HTML, CSS, JavaScript / AngularJS, dll ...). Aplikasi web ini akan berinteraksi dengan REST API untuk mengakses dan memodifikasi data. Saat ini belum diputuskan pada jenis sistem otentikasi apa yang akan digunakan oleh REST API.

Dari pemahaman saya, semua jenis sistem otentikasi API (API Keys, OAuth 1/2, dll ...) akan memiliki data tertentu yang perlu dirahasiakan jika akses dapat dikompromikan. Untuk Kunci API, kunci mereka sendiri harus dirahasiakan, karena OAuth 2 rahasia klien / token akses / token penyegaran perlu dirahasiakan, saya yakin beberapa dari 4 kunci yang terlibat dalam OAuth 1 perlu dirahasiakan (tidak terlalu banyak pengalaman dengan OAuth 1). Saya telah mencoba untuk berpikir jika ada cara untuk menyimpan hal-hal rahasia ini dalam aplikasi web sisi-klien murni tanpa lapisan tengah macam di sisi server.

Saya telah mencoba untuk memikirkan hal ini dan saya tidak dapat memikirkan tempat untuk melakukan itu. Maksud saya, saya tidak bisa menyimpannya dalam javascript karena siapa pun bisa melihat sumbernya atau membuka konsol dan mendapatkan datanya. Saya tidak 100% yakin seberapa aman localStorage dan jika pengguna dapat mengakses / memodifikasi data itu. Bahkan jika penyimpanan lokal aman, dua cara yang bisa saya pikirkan untuk memasukkan data ke dalamnya adalah tidak. Salah satu caranya adalah dengan hanya menyimpan data dalam kode sumber javascript yang merupakan hal paling tidak aman yang dapat saya pikirkan. Sekarang jika saya menggunakan sesuatu seperti OAuth 2 di mana api sisanya itu sendiri akan memberi saya token, itu masih belum seaman itu (lebih baik daripada opsi pertama) karena token itu akan dikembalikan sebagai teks biasa sehingga siapa saja yang dapat melihat permintaan yang dibuat komputer dapat melihat.

Apakah ada cara untuk memiliki aplikasi yang benar-benar menjalankan sisi klien dapat menyimpan potongan-potongan data rahasia dengan aman tanpa semacam lapisan tengah di sisi server?

ryanzec
sumber
Penyimpanan lokal khusus untuk peramban, tetapi menggunakan Opera di Windows sebagai contoh, hanya beberapa file disk di folder profil pengguna, jadi pada dasarnya tidak terlindungi.
Ross Patterson
Salah satu caranya adalah menyimpan rahasia di server dalam db dan hanya memiliki application_id di klien. Kemudian lakukan permintaan oauth dari server, jadi ini adalah semacam pendekatan proxy.
Simon Polak

Jawaban:

9

Tidak, itu tidak pernah benar-benar aman. Pengguna mengendalikan perangkat keras, dan Anda mencoba untuk menjaga sesuatu dari tangan mereka. Pada akhirnya, mereka BISA mendapatkannya melalui satu atau lain cara. Karena Anda bekerja dari javascript, posisi Anda JAUH lebih buruk daripada aplikasi komputer normal, karena tidak hanya pengguna mengontrol perangkat keras, mereka mengontrol kotak pasir yang Anda jalankan.

Anda dapat menyembunyikan sesuatu, dan membuatnya sulit untuk mendapatkan barang, tetapi pada akhirnya mereka BISA mengeluarkannya, jika mereka berusaha cukup keras.

Michael Kohne
sumber
4
^ ini. Seberapa "rahasia" data rahasia itu, dan berapa banyak waktu dan uang yang melindunginya sebenarnya bernilai? Upaya "standar industri" mungkin cukup.
DaveE
+1 Jawaban luar biasa. Dengan debugger JavaScript, saya dapat mengubah aplikasi Anda, melihat nilai-nilai perantara, dll. Jika saya ingin informasinya, saya akan mendapatkannya.
Ross Patterson
2

Saat merancang sistem keamanan, kita harus selalu memikirkan model ancaman. " Jadikan aman " adalah persyaratan konyol, tidak dapat ditindaklanjuti atau diverifikasi. " Mencegah pengguna mengekstraksi token akses dari aplikasi " jauh lebih baik, dan menentukan batas-batas solusi. " Mencegah orang lain mendapatkan token akses pengguna " juga lebih baik, dan mendefinisikan ruang solusi yang sama sekali berbeda. Solusi untuk satu belum tentu menyelesaikan yang lain ( misalnya , yang terakhir benar-benar membutuhkan SSL jika WiFi terlibat, tetapi itu tidak akan mempengaruhi yang sebelumnya sama sekali).

Ross Patterson
sumber
0

satu opsi adalah untuk REST API untuk memberikan akses atau tidak berdasarkan login pengguna; itu dapat mengembalikan token berbasis sesi (guid, string hash, apa pun yang Anda suka) yang dapat diteruskan ke panggilan REST API lainnya untuk mengotentikasi akses

jika Anda khawatir tentang menyimpan info login pengguna di mesin klien, maka jangan, tetapi pengguna harus memasukkan informasi akun dan kata sandi setiap kali

tidak begitu akrab dengan OAuth et al, tapi saya tidak melihat alasan kuat di atas untuk menyimpan informasi otentikasi secara terus-menerus ...

Steven A. Lowe
sumber
Adapun alasannya, selalu ada "kenyamanan" yang jelas merupakan musuh bebuyutan "keamanan" dan "keselamatan".
henon