Di MindTheClub, konten pesan berjalan langsung antara dua perangkat lewat saluran peer-to-peer terenkripsi. Tidak ada server MindTheClub, dan tidak ada pihak ketiga, yang menyimpan konten pesanmu.
Untuk membangun koneksi langsung itu, dua perangkat perlu bertukar sedikit informasi penyiapan dan, jika salah satu perangkat tertidur, sebuah sinyal untuk membangunkannya. Dua langkah pendukung itu adalah satu-satunya tempat server terlibat, dan di bawah ini kami jelaskan dengan tepat apa yang bisa dan tidak bisa dilihat masing-masing.
Sebelum semua itu terjadi, kedua perangkat perlu mengetahui identitas satu sama lain. Kami jelaskan itu lebih dulu, karena setiap langkah berikutnya di halaman ini dibangun di atasnya.
Setiap langkah terenkripsi berikutnya bergantung pada satu asumsi: setiap peer memakai kunci publik asli milik peer lainnya, bukan kunci yang ditukar oleh penyedia di tengah jalan. Kami mencapainya dengan satu pertukaran di luar jalur dan balasan tersegel, sehingga kedua pihak terverifikasi setelah satu pemindaian QR atau satu ketukan pada tautan undangan.
Kode QR-mu berisi identitas penggunamu dan sidik jari kunci publikmu — hash kriptografis pendek yang mengidentifikasinya secara unik. Tautan undanganmu membawa dua hal yang sama, tertanam di dalam tautan itu sendiri. Jadi, entah seseorang memindai kodemu atau mengetuk tautanmu, perangkatnya menerima sidik jari yang sama untuk diperiksa. Menunjukkan QR secara tatap muka adalah jalur paling kuat, tapi dalam kedua kasus jaminan di bawah ini berlaku: penyedia direktori tidak pernah bisa menukar kuncimu tanpa terdeteksi.
Saat orang lain memindai atau mengetuk, perangkatnya mengambil kunci publikmu dari direktori dan menghitung sidik jarinya secara lokal. Jika cocok dengan yang ada di QR atau tautan, kunci diterima; jika tidak, kunci ditolak dan tidak disimpan. Kunci yang ditukar menghasilkan ketidakcocokan, dan perangkat menolaknya.
Perangkat mereka lalu mengirimimu permintaan kontak dengan sidik jari mereka sendiri tersegel di dalamnya, dienkripsi dengan kuncimu yang sudah terverifikasi. Hanya kamu yang bisa mendekripsinya. Perangkatmu menjalankan pemeriksaan yang sama secara terbalik, menerima kontak hanya jika sidik jarinya cocok.
Setelah satu pemindaian atau ketukan, kedua peer telah memverifikasi kunci satu sama lain secara independen, dan penyedia yang memegang direktori tidak bisa menukar salah satunya tanpa merusak pemeriksaan yang tidak mampu ia palsukan.
MindTheClub menggunakan saluran data WebRTC untuk membawa pesan. Saluran data WebRTC adalah koneksi langsung terenkripsi antara dua perangkat. Begitu terbangun antara dua peer:
File besar dipecah menjadi potongan dan dikirim lewat saluran langsung yang sama, dengan logika pengiriman ulang di perangkat pengirim untuk menjamin pengiriman pada akhirnya. Potongan-potongan itu berjalan peer-to-peer seperti segalanya.
Terkadang dua perangkat tidak bisa membuka jalur langsung (NAT ketat, firewall operator seluler). Dalam kasus itu, WebRTC beralih ke relay TURN untuk meneruskan aliran terenkripsi. MindTheClub memakai layanan TURN Cloudflare untuk cadangan ini. Relay hanya meneruskan paket terenkripsi; ini bagian standar dari cara kerja WebRTC saat koneksi langsung tidak memungkinkan. Cadangan ini hanya memengaruhi jalur jaringan aliran terenkripsi; ia tidak mengubah fakta bahwa konten tetap ujung ke ujung antara kedua perangkat.
Sebelum saluran WebRTC bisa terbuka, kedua perangkat harus bertukar informasi "signalling": deskripsi koneksi dan kandidat alamat jaringan (dalam istilah WebRTC, offer/answer SDP dan kandidat ICE). Ini kebutuhan universal WebRTC — setiap aplikasi WebRTC, termasuk situs panggilan video, melakukannya. Informasinya kecil dan hanya dibutuhkan untuk membangun koneksi; ini bukan konten pesanmu.
Pertanyaannya adalah siapa yang membawa signalling itu, dan apa yang bisa mereka lihat. Di MindTheClub:
Kami merancang signalling agar relay mengetahui sesedikit mungkin:
Jika ponsel Bob tertidur atau aplikasinya tidak berjalan, perangkat Alice butuh cara untuk membangunkannya agar bisa bergabung ke koneksi. Untuk ini, MindTheClub memakai Firebase Cloud Messaging (FCM), layanan push Google, karena itulah mekanisme yang disediakan Android untuk membangunkan aplikasi secara andal dari latar belakang.
Isi muatan bangun dienkripsi dengan kunci publik penerima sebelum meninggalkan pengirim. Yang terpenting, identitas pengirim berada di dalam muatan terenkripsi itu — tidak terlihat oleh infrastruktur push. Ini desain "sealed sender": pihak yang mengantarkan push tidak bisa melihat siapa yang mengirimnya.
Untuk mengantarkan push, sistem push mana pun harus tahu siapa penerimanya — begitulah cara pengiriman bekerja, dan itu berlaku untuk setiap aplikasi pesan berbasis push. Jadi alamat penerima mau tidak mau terlihat oleh lapisan push. Yang tidak terlihat adalah identitas pengirim, yang tetap tersegel di dalam muatan terenkripsi.
Untuk membangun koneksi WebRTC, perangkat butuh kredensial berumur pendek untuk layanan STUN/TURN (komponen yang membantu dua perangkat menemukan jalur jaringan satu sama lain). Kredensial ini dibuat dengan kunci rahasia yang harus disimpan di luar perangkat.
MindTheClub mengambil kredensial ini dari Cloudflare Worker yang memegang rahasia itu di sisi server. Tidak ada layanan Google yang terlibat dalam memperoleh kredensial koneksi. Jika pengambilan ini gagal, koneksi beralih ke server STUN publik, yang hanya membantu perangkat menemukan alamat publiknya sendiri dan tidak mengetahui apa pun tentang siapa yang dihubunginya.
Menggabungkan semuanya: peer memverifikasi kunci satu sama lain dengan satu pemindaian QR atau tautan, lalu bertukar sedikit informasi penyiapan terenkripsi melalui relay tanpa status dan push bangun tersegel. Begitu saluran langsung terbuka, konten pesan mengalir hanya dari perangkat ke perangkat.