Jika pada layar login pengguna mengirimkan formulir dengan nama pengguna dan kata sandi, kata sandi dikirim dalam teks biasa (bahkan dengan POST, koreksi saya jika saya salah).
Jadi pertanyaannya adalah bagaimana cara yang benar untuk melindungi pengguna dan kata sandinya dari pihak ketiga yang mungkin menguping data komunikasi?
Saya sadar bahwa HTTPS adalah solusi untuk masalah ini, tetapi adakah cara untuk memastikan setidaknya beberapa tingkat keamanan menggunakan protokol HTTP standar (permintaan POST)? (mungkin menggunakan javascript dalam beberapa cara)
EDIT Saya mungkin telah meninggalkan beberapa hal penting.
Apa yang saya tentang adalah halaman - yaitu halaman login yang dihasilkan PHP, yang tentu saja dikirim ke pengguna dalam permintaan HTTP GET sebagai file HTML. Tidak ada koneksi (@Jeremy Powel) yang dibuat antara server dan klien jadi saya tidak dapat membuat protokol handshaking seperti itu. Dan saya ingin proses lengkapnya transparan bagi pengguna - dia ingin mengirimkan kata sandi, bukan berurusan dengan kriptografi.
Terima kasih.
Jawaban:
Menggunakan HTTP dengan SSL akan membuat hidup Anda lebih mudah dan Anda bisa tenang. Orang-orang yang sangat pintar (setidaknya lebih pintar dari saya!) Telah meneliti metode komunikasi rahasia ini selama bertahun-tahun.
sumber
Otentikasi aman adalah topik yang luas. Singkatnya, seperti yang disebutkan @ jeremy-powell, selalu lebih menyukai pengiriman kredensial melalui HTTPS daripada HTTP. Ini akan menghilangkan banyak sakit kepala terkait keamanan.
Sertifikat TSL / SSL cukup murah akhir-akhir ini. Bahkan jika Anda tidak ingin mengeluarkan uang sama sekali, ada letsencrypt.org gratis - Otoritas Sertifikat otomatis.
Anda dapat melangkah lebih jauh dan menggunakan caddyserver.com yang memanggil letsencrypt di latar belakang.
Sekarang, setelah kami mendapatkan HTTPS ...
Anda tidak boleh mengirim login dan kata sandi melalui payload POST atau parameter GET. Gunakan header Otorisasi (Skema otentikasi akses dasar) sebagai gantinya, yang dibuat sebagai berikut:
Ini mungkin tampak agak rumit, tetapi sebenarnya tidak. Ada banyak perpustakaan bagus di luar sana yang akan menyediakan fungsionalitas ini untuk Anda di luar kotak.
Ada beberapa alasan bagus Anda harus menggunakan header Otorisasi
https://user:[email protected]/login
(Chrome, misalnya akan secara otomatis mengubahnya menjadiAuthorization
tajuk)PENTING:
Seperti yang ditunjukkan oleh @zaph dalam komentarnya di bawah ini, mengirimkan info sensitif sebagai kueri GET bukanlah ide yang baik karena kemungkinan besar akan berakhir di log server.
sumber
Authorization
header. Coba saja. Log akan mengingatkan bersih. Dan tentu saja jika Anda membuat panggilan dari server (jika itu skenario yang Anda khawatirkan), Anda harus membuat header secara terprogram tentunya.username:password@url
dari browser diterjemahkan menjadi:url
+Authorization
header permintaan. Adapun pertanyaan GET ... seperti yang saya katakan, gunakan header Authroziation. Ini lebih baik.Anda dapat menggunakan skema respons tantangan. Katakanlah klien dan server sama-sama mengetahui rahasia S. Kemudian server dapat memastikan bahwa klien mengetahui kata sandi (tanpa memberikannya) dengan:
Edit:
Ada masalah di sini dengan kesegaran R dan fakta bahwa HTTP tidak memiliki kewarganegaraan. Ini dapat ditangani dengan meminta server membuat rahasia, sebut saja Q, yang hanya diketahui oleh server . Kemudian protokolnya seperti ini:Sebagai catatan, karena H (R, Q) tidak dapat dipalsukan oleh klien, H (R, Q) bertindak sebagai cookie (dan oleh karena itu sebenarnya dapat diimplementasikan sebagai cookie).Edit Lainnya:
Pengeditan protokol sebelumnya tidak benar karena siapa pun yang telah mengamati H (R, Q) tampaknya dapat memutarnya kembali dengan hash yang benar. Server harus mengingat R mana yang tidak lagi segar. Saya CW'ing jawaban ini sehingga kalian dapat mengedit ini dan mengerjakan sesuatu yang baik.
sumber
Jika host web Anda mengizinkannya, atau Anda perlu menangani data sensitif, gunakan HTTPS, titik. (Ini sering diwajibkan oleh hukum afaik).
Sebaliknya jika Anda ingin melakukan sesuatu melalui HTTP. Saya akan melakukan sesuatu seperti ini.
Jadi dengan cara ini kata sandi dilindungi dan hash otentikasi yang sama tidak dapat diputar ulang.
Tentang keamanan token sesi. Itu sedikit lebih sulit. Tetapi mungkin untuk membuat penggunaan kembali token sesi yang dicuri sedikit lebih sulit.
Jadi jika token sesi dicuri, dan permintaan dikirim oleh orang lain, maka sesi tersebut akan dimusnahkan berdasarkan permintaan pengguna asli berikutnya. Jadi jika pengguna aktif menjelajahi situs, sering mengklik tautan, maka pencuri tidak akan bertindak jauh dengan token yang dicuri. Skema ini dapat diperkuat dengan meminta otentikasi lain untuk operasi sensitif (seperti penghapusan akun).
EDIT: Harap dicatat ini tidak mencegah serangan MITM jika penyerang mengatur halaman mereka sendiri dengan kunci publik yang berbeda dan permintaan proxy ke server. Untuk melindungi dari ini, kunci publik harus disematkan di penyimpanan lokal browser atau di dalam aplikasi untuk mendeteksi jenis trik ini.
Tentang implementasinya: RSA mungkin adalah algoritme yang paling dikenal, tetapi agak lambat untuk kunci yang panjang. Saya tidak tahu seberapa cepat implementasi PHP atau Javascript nantinya. Tapi mungkin ada algoritma yang lebih cepat.
sumber
Saya akan menggunakan sistem pertukaran kunci Diffie-Hellman sisi-server dan sisi-klien dengan AJAX atau beberapa pengiriman formulir (saya merekomendasikan yang pertama), meskipun saya tidak melihat implementasi yang baik darinya di internet. Ingatlah bahwa pustaka JS selalu dapat rusak atau diubah oleh MITM. Penyimpanan lokal dapat digunakan untuk membantu memerangi ini, sampai batas tertentu.
sumber
Anda dapat menggunakan SRP untuk menggunakan kata sandi aman melalui saluran yang tidak aman. Keuntungannya adalah bahkan jika penyerang mengendus lalu lintas, atau menyusupi server, mereka tidak dapat menggunakan sandi di server lain. https://github.com/alax/jsrp adalah pustaka javascript yang mendukung kata sandi aman melalui HTTP di browser, atau sisi server (melalui node).
sumber
HTTPS sangat kuat karena menggunakan kriptografi asimetris. Jenis kriptografi ini tidak hanya memungkinkan Anda membuat terowongan terenkripsi tetapi Anda juga dapat memverifikasi bahwa Anda berbicara dengan orang yang tepat, dan bukan peretas.
Berikut adalah kode sumber Java yang menggunakan cipher RSA asimetris (digunakan oleh PGP) untuk berkomunikasi: http://www.hushmail.com/services/downloads/
sumber
Anda dapat menggunakan ssl untuk host Anda, ada proyek gratis untuk ssl seperti letsencrypt https://letsencrypt.org/
sumber
Menggunakan https terdengar pilihan terbaik di sini (sertifikat tidak semahal itu saat ini). Namun jika http merupakan persyaratan, Anda dapat menggunakan beberapa encription - encript di sisi server dan decript di browser pengguna (kirim kunci secara terpisah).
Kami telah menggunakannya saat mengimplementasikan safevia.net - enkripsi dilakukan pada sisi klien (pengirim / penerima), sehingga data pengguna tidak tersedia pada lapisan jaringan atau server.
sumber