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.
- Server menyematkan kunci publiknya ke halaman login.
- Klien mengisi formulir login dan mengklik kirim.
- Permintaan AJAX mendapatkan stempel waktu saat ini dari server.
- Skrip sisi klien menggabungkan kredensial, stempel waktu, dan salt (di-hash dari data analog misalnya gerakan mouse, peristiwa penekanan tombol), mengenkripsinya menggunakan kunci publik.
- Mengirimkan hash yang dihasilkan.
- Server mendekripsi hash
- Memeriksa apakah stempel waktu cukup baru (memungkinkan jendela pendek 5-10 detik saja). Menolak login jika stempel waktunya terlalu lama.
- Menyimpan hash selama 20 detik. Menolak hash yang sama untuk login selama interval ini.
- Mengotentikasi pengguna.
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.
- Server menetapkan cookie sesi tambahan yang berisi string acak.
- Browser mengirimkan kembali cookie ini pada permintaan berikutnya.
- Server memeriksa nilai dalam cookie, jika berbeda maka itu akan menghancurkan sesi, jika tidak semuanya baik-baik saja.
- Server menyetel cookie lagi dengan teks yang berbeda.
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.