Akankah Otentikasi dari HTTPS memperlambat Aplikasi Saya?

11

Saya sedang membangun aplikasi web dan layanan web yang tenang.

Saya telah membaca berbagai artikel tentang cara terbaik untuk mengotentikasi permintaan ke layanan web.

Pilihan terbaik bagi saya tampaknya menggunakan otentikasi dasar HTTP. Hampir setiap artikel yang saya baca mengatakan bahwa otentikasi harus dienkripsi melalui SSL atau yang setara.

Saya tidak sepenuhnya yakin apa ini melibatkan. Apakah ini berarti seluruh layanan web saya harus berada di server yang aman? Apakah ini akan memperlambat segalanya?

Gaz_Edge
sumber
Suatu pemikiran, kemampuan data untuk dimuat di https. Saya tidak 100% yakin jika / bagaimana ini akan berdampak.
Saya tidak yakin saya mengikuti. Apakah Anda mengatakan caching tidak mungkin?
Gaz_Edge
Ada interaksi antara ssl / https dan server web yang mungkin tidak diinginkan dengan REST - cxf.547215.n5.nabble.com/... - Saya belum menggali terlalu jauh ke dalam REST di lingkungan yang aman sehingga ini belum menjadi masalah bagi saya. Ini lebih dari pemikiran dan petunjuk dari hari-hari saya sebagai admin apache.
Terima kasih. Anda mengatakan Anda belum pernah menggunakan REST di lingkungan yang aman. Apakah itu berarti Anda tidak menggunakan otentikasi? Atau apakah Anda melakukannya dengan cara yang berbeda dengan http basic.
Gaz_Edge
Entah tidak ada otentikasi, dasar, atau berbasis ip ... dan murni dalam intranet (tidak ada yang menghadap eksternal).

Jawaban:

11

Pertama-tama, cobalah untuk memahami bagaimana SSL (HTTPS) dan otentikasi HTTP bekerja.

Metode otentikasi HTTP biasa (Intisari, Dasar, dan segala bentuk + skema otentikasi berbasis cookie yang dapat Anda terapkan di atas HTTP) semuanya tidak aman sendiri, karena mereka mengirim informasi otentikasi kurang lebih dalam teks yang jelas. Apakah data di bidang POST atau header, dan apakah pengkodean base64 diterapkan, tidak masalah sama sekali dalam hal ini, kata sandi jelas terlihat oleh siapa pun yang memiliki akses ke lalu lintas jaringan. Ini berarti bahwa otentikasi HTTP melalui saluran yang tidak terpercaya tidak berharga: yang diperlukan seorang penyerang untuk membaca kata sandi Anda adalah mengendus jaringan kecil.

SSL mengimplementasikan saluran komunikasi yang aman melalui saluran yang pada dasarnya tidak aman. Ini berfungsi, kira-kira, sebagai berikut:

  1. Server mengirimkan sertifikat yang ditandatangani
  2. Klien memvalidasi sertifikat terhadap daftar kunci penandatanganan yang dikenal baik; tanda tangan sertifikat dapat dirantai, sehingga setiap simpul mengatakan "jika tanda tangan yang menandatangani saya baik, maka saya juga", tetapi pada akhirnya, rantai harus diselesaikan ke salah satu dari segelintir otoritas tepercaya yang telah dikonfigurasi ulang pada klien.
  3. Klien menggunakan kunci enkripsi publik server untuk mengirim rahasia bersama
  4. Server mendekripsi rahasia bersama menggunakan kunci privat (karena hanya server yang sah yang memiliki kunci privat, server lain tidak akan dapat mendekripsi rahasia bersama)
  5. Klien mengirimkan data permintaan aktual, dienkripsi menggunakan rahasia bersama
  6. Server mendekripsi data permintaan, lalu mengirim respons terenkripsi
  7. Klien mendekripsi respons dan menyajikannya kepada pengguna.

Perhatikan beberapa poin penting di sini:

  • Rantai sertifikat memungkinkan klien untuk memastikan bahwa server yang mereka ajak bicara adalah yang asli, bukan seseorang yang memotong permintaan mereka. Inilah sebabnya mengapa Anda harus membeli sertifikat SSL asli, dan mengapa browser memberikan peringatan menakutkan kepada Anda ketika Anda menekan situs yang menggunakan sertifikat yang tidak valid, kedaluwarsa, atau salah: semua enkripsi di dunia tidak membantu jika Anda berbicara dengan orang yang salah.
  • Enkripsi publik / pribadi yang digunakan untuk bertukar rahasia memastikan bahwa komunikasi yang berhasil hanya akan berfungsi antara pasangan klien dan server ini: paket jaringan sniffed akan dienkripsi, dan mereka akan memerlukan kunci pribadi server untuk mendapatkan data.
  • Enkripsi simetris digunakan untuk sebagian besar permintaan, karena memiliki overhead kinerja yang jauh lebih rendah daripada enkripsi kunci privat / publik. Kunci (rahasia bersama) dipertukarkan menggunakan enkripsi kunci publik / publik, karena itu adalah satu-satunya cara untuk melakukannya dengan cara yang aman (kecuali mengangkutnya melalui saluran terpisah, seperti layanan kurir).

Jadi jelas, ada beberapa overhead yang terlibat, tapi itu tidak seburuk yang Anda kira - itu sebagian besar pada skala di mana "melemparkan lebih banyak perangkat keras padanya" adalah respons yang tepat, kecuali Anda sedang mempersiapkan lalu lintas dalam jumlah sangat besar ( pikirkan Google atau Facebook). Dalam keadaan normal, yaitu penggunaan aplikasi web biasa, overhead SSL dapat diabaikan, dan akibatnya, segera setelah Anda memiliki data rahasia sama sekali, yang terbaik adalah menjalankan semuanya melalui SSL, termasuk sumber daya. SSL juga satu-satunya cara untuk mengamankan lalu lintas HTTP; metode lain sama sekali tidak terstandarisasi dan dengan demikian tidak didukung secara luas, dan Anda sama sekali tidak ingin menerapkan hal-hal ini sendiri, karena jujur, itu terlalu mudah untuk salah paham.

TL; DR: Ya, SSL + Otentikasi Dasar adalah ide yang bagus, ya, Anda memerlukan server yang aman (dan sertifikat yang valid ), ya, itu akan memperlambat segalanya, tetapi tidak, ini bukan sesuatu yang perlu dikhawatirkan sekarang.

tammmer
sumber
12

HTTPS (SSL) bukan FYI otentikasi pengguna. Itu hanya menyediakan enkripsi antara 2 titik akhir.

Tapi ya, ada sedikit overhead kecil dari itu (meskipun tidak cukup untuk menjamin perubahan rencana / perangkat keras). Lihat disini :

/programming/548029/how-much-overhead-does-ssl-impose

brian
sumber
7
+1 lebih baik menjadi terlalu aman daripada tidak cukup aman mengingat overhead yang kecil
Earlz
2
Jawaban ini sangat menyesatkan. SSL adalah otentikasi, hanya saja biasanya bukan otentikasi pengguna . SSL mengautentikasi bahwa server yang Anda ajak bicara benar-benar seperti yang dikatakannya. (Tugas CA adalah hanya mengeluarkan sertifikat untuk facebook.com ke Facebook.) Selain itu, SSL dapat melakukan otentikasi pengguna dengan sertifikat klien.
josh3736
@ Brian: Saya setuju dengan josh3736. SSL memang menyediakan otentikasi dalam arti kata kriptografis. Tanpa autentikasi (mis. Server) Anda terbuka untuk man in the middle attacks. SSL dapat memberikan otentikasi klien (pengguna) aman menggunakan kartu pintar atau jika telah mengotentikasi server, cara lain (mis. Nama pengguna / kata sandi) dapat digunakan melalui saluran aman.
Guy Sirton
Sungguh, jelas OP bertanya tentang otentikasi pengguna dan tidak khawatir tentang klien mengotentikasi dengan siapa mereka berbicara / man dalam serangan tengah. Saya mengedit posting saya dalam menghadapi kesedihan parah;) secara teknis benar adalah jenis yang terbaik, setelah semua
brian
6

Dengan otentikasi dasar HTTP, nama pengguna dan kata sandi yang disediakan pengguna dikirim dengan setiap permintaan ke server. Ini berarti mereka ada dalam teks biasa bahkan di area situs Anda yang tidak perlu aman. Jelas, Anda ingin SSL di sini untuk menjaga keamanan pengguna Anda.

Secara teori, Anda dapat menggunakan otentikasi cookie dan hanya menempatkan SSL pada halaman login (tempat nama pengguna dan kata sandi dikirim). Jika cookie Anda cukup aman dan aman terhadap serangan replay, maka penyerang tidak akan bisa melakukan apa pun dengan mereka bahkan jika mereka berhasil mendapatkannya.

Earlz
sumber
3

Otentikasi dasar adalah menetapkan nama pengguna dan kata sandi di header permintaan http. Jika Anda tidak menggunakan SSL atau yang setara maka nama pengguna dan kata sandi itu dikirim dalam teks biasa dan sepele bagi siapa pun untuk mencuri.

Sebagian besar server web mendukung HTTPS di luar kotak saat ini dan meskipun hal itu menambah biaya tambahan untuk setiap panggilan, biaya tetap minimal.

Anda bisa mengamankan beberapa titik akhir dan bukan yang lain (yaitu memiliki titik akhir autentikasi yang menghasilkan token yang dapat digunakan untuk panggilan lain). Saya akan sangat menyarankan SSL untuk seluruh layanan karena ini jauh lebih aman. (jika tidak ada yang lain itu menghentikan data sensitif dicegat)

Tom Squires
sumber
Ya saya pikir itu terdengar seperti ide terbaik. Aplikasi web saya akan mengatur sesi pengguna dll sehingga dapat menyimpan token di sana. Tetapi seseorang masih bisa mengintip token untuk sesi itu, kan? Mungkin masih berisiko terhadap keamanan data
Gaz_Edge
Ya secara umum. Ada beberapa hal yang dapat Anda lakukan untuk mengamankan cookie (yaitu mengenkripsi mereka) tetapi rute yang lebih sederhana dan lebih efektif adalah mengamankan seluruh situs. Kecuali Anda memiliki use case khusus, saya akan merekomendasikan solusi paling sederhana
Tom Squires
2

Jeff Atwood menulis posting blog singkat belum lama ini tentang apakah enkripsi penuh adalah cara untuk pergi. Dia menggambarkan beberapa contoh dunia nyata dan memiliki beberapa garis pertimbangan kinerja juga.

Selain itu, ia mereferensikan artikel ini tentang studi kasus Gmail, mengutip yang berikut:

Pada Januari tahun ini (2010), Gmail beralih menggunakan HTTPS untuk semuanya secara default. Sebelumnya itu telah diperkenalkan sebagai opsi, tetapi sekarang semua pengguna kami menggunakan HTTPS untuk mengamankan email mereka antara browser mereka dan Google, sepanjang waktu. Untuk melakukan ini, kami harus menggunakan tidak ada mesin tambahan dan tidak ada perangkat keras khusus. Pada mesin frontend produksi kami, SSL / TLS menyumbang kurang dari 1% dari beban CPU, kurang dari 10KB memori per koneksi dan kurang dari 2% dari overhead jaringan. Banyak orang percaya bahwa SSL membutuhkan banyak waktu CPU dan kami berharap angka-angka di atas (publik untuk pertama kalinya) akan membantu menghilangkannya.

Dia juga menyebutkan beberapa peningkatan terbaru terhadap caching halaman sisi klien melalui HTTPS oleh browser .

Meskipun demikian, ia menunjukkan, ada hukuman lain, kebanyakan dari mereka bukan kinerja tetapi biaya implementasi:

  • Mempertahankan kualitas perangkat lunak sambil menambahkan kompleksitas tambahan untuk tim yang sudah sibuk,
  • Caching proxy jauh lebih sulit untuk dikonfigurasi dengan benar dan memerlukan perubahan kode juga,
  • Sulit untuk mendapatkan keamanan yang tepat untuk penyatuan konten dari berbagai sumber,
  • Perangkat seluler kelas bawah mungkin kesulitan menggunakan enkripsi.
Daniel Dinnyes
sumber
Harap rentangkan jawaban Anda dan sertakan beberapa sorotan dari blog.
Walter
Sorotan dari posting blog ditambahkan.
Daniel Dinnyes
0

Autentikasi dasar HTTP tanpa penanganan sesi Anda sendiri mungkin akan membuat Anda terbuka untuk serangan pemalsuan permintaan Situs silang. Anda mungkin dapat menggunakannya jika Anda pasangan dengan penanganan sesi Anda sendiri, tetapi Anda mungkin mengalami kesulitan menyediakan fungsi "logout" yang bersih.

Apa pun yang Anda gunakan untuk otentikasi, Anda harus menggunakan HTTPS untuk mengenkripsi koneksi (kecuali jika aplikasi web hanya diakses pada jaringan yang terkontrol dan aman). Ini mungkin memperlambat sedikit ( pengaturan koneksi mahal, tetapi browser cenderung menjaga koneksi untuk sementara waktu), tetapi jika Anda menginginkan aplikasi yang aman, Anda tidak akan dapat menghindarinya, jadi Anda tidak benar-benar perlu khawatir tentang hal itu.

Catatan: "Otentikasi HTTPS" (yang Anda sebutkan dalam judul) menyesatkan - ini bisa merujuk ke otentikasi sertifikat klien SSL, yang tidak ada hubungannya dengan teks pertanyaan Anda dan memiliki serangkaian manfaat dan masalah. Anda mungkin tidak ingin menyentuhnya.

Jan Schejbal
sumber
0

Bagaimana Anda akan mencapai otentikasi dasar?
Jika itu adalah nama pengguna / kata sandi yang sulit dikodekan dan Anda menggunakan fungsionalitas bawaan server web Anda untuk melakukannya, kemungkinan akan berdampak hampir nol. Jika Anda tidak melakukan hal-hal gila dalam database atau hal serupa, maka ya mungkin ada dampaknya.

Seperti yang telah dicatat orang lain di sini, SSL & mengirim tajuk tambahan secara teknis akan membuat segalanya lebih lambat tetapi tidak akan signifikan dalam hal apa pun.

brianfeucht
sumber