Saya sedang mengerjakan API untuk layanan REST yang akan saya produksi dan konsumsi. Saya telah menghabiskan beberapa hari terakhir mencoba mencari cara untuk menangani otentikasi dengan baik, dan berpikir saya akhirnya menemukan sesuatu.
Saya datang dengan ini berdasarkan fakta-fakta berikut tentang tumpukan aplikasi:
- Klien & Server berada di .NET4 (Bagian klien dalam Profil Klien)
- Server terpapar menggunakan WCF REST
- Saya benar-benar tidak ingin menyimpan nama pengguna dan kata sandi di memori dalam aplikasi
Dari 3, saya ingin menggunakan bentuk otentikasi token, sehingga setelah kredensial diverifikasi oleh server, klien mendapat token kembali untuk digunakan sepanjang sisa aplikasi (ini akan memungkinkan saya untuk melakukan hal-hal lain, seperti mengatur waktu pengguna, dapat memindahkan pengguna dengan mulus antara versi web dan desktop, dll). Setelah mencari tahu cara membuat panggilan ulang dan mengutak-atik, saya telah datang dengan yang berikut:
- Sebelum klien mencoba untuk mengotentikasi, itu menghasilkan pasangan kunci Diffie-Hellman menggunakan
ECDiffieHellmanCng
kelas. - Ini mengirimkan bagian publik dari pasangan kunci melalui kawat bersama dengan nama pengguna dan kata sandi (Tentu saja HTTPS).
- Server mengautentikasi kombinasi nama pengguna / kata sandi, jika berhasil, ia akan melakukan yang berikut:
- Membuat token sesi unik
- Menghasilkan pasangan kunci DH sendiri, dan menghitung rahasia bersama dari kunci publik yang disediakan oleh klien
- Membuat catatan dari token sesi, rahasia bersama, pengguna, dan waktu "aksi terakhir" (digunakan untuk jendela kedaluwarsa bergulir) dalam database-nya
- Mengembalikan token sesi, kunci DH publiknya, dan pesan keberhasilan otentikasi
- Klien mengambil kunci DH dari respons, menghitung rahasia bersama, dan menyimpan token dan rahasia dalam memori.
Sejak saat ini, kombinasi token / rahasia sesi berfungsi seperti kebanyakan REST API lainnya, dengan permintaan yang diambil sidik jari dan cap waktu, dan kemudian menghasilkan semacam HMAC. Setiap kali klien melakukan tindakan terhadap server, itu memeriksa token / pasangan rahasia, dan memungkinkan tindakan jika valid dan tidak kedaluwarsa, dan memperbarui catatan tindakan terakhir dalam sesi.
Saya tidak melihat kekurangan yang jelas, dan mungkin terlalu banyak direkayasa untuk ini, tetapi saya perlu belajar bagaimana melakukan ini di beberapa titik. HMAC mencegah serangan replay, negosiasi DH membantu mencegah serangan MITM (Saya tidak bisa memikirkan serangan yang bisa dilakukan dari atas kepala saya antara HMAC / DH).
Adakah lubang yang bisa ditusuk orang dalam hal ini?