%100 Sunucusuz, Sıfır Günlüklü Güvenli Sesli Sohbet Oluşturdum (Ve Nedeni İşte)
Sesli aramalarınızın meta verilerine ne olacağını hiç düşündünüz mü?
WhatsApp, Signal veya Telegram gibi uçtan uca şifrelenmiş uygulamaların standart olduğu bir çağda yaşıyoruz. Onlar şifrelerken içerikKonuşmalarımızın çoğunda bizi bağlamak için hâlâ merkezi sunuculara güveniyorlar. Bu, sunucunun ve onu kontrol eden kişinin her zaman bildiği anlamına gelir DSÖsen arıyorsun, Ne zamanonları aradın ve ne kadardırkonuştun.
Bu bağımlılığa meydan okumak istedim. Kendime şunu sordum: Sunucuyu tamamen ortadan kaldıracak bir sesli iletişim aracı oluşturmak mümkün müdür?Veritabanı yok, WebSocket yok, hesap yok ve kesinlikle sıfır günlük.
Sonuç, tek bir HTML dosyası kullanarak tamamen eşler arası çalışan, tamamen işlevsel, tarayıcı tabanlı bir sesli sohbettir. İşte onu neden kurduğumun, neyi başarmayı hedeflediğimin ve gerçekte nasıl çalıştığının hikayesi.
"Neden": Meta Verilerden Kurtulmak
Geleneksel VoIP uygulamalarında mimari, A Kullanıcısının B Kullanıcısını bulmak için Sunucuyla konuşması gerektiğini belirtir. Sunucu aracı görevi görür. Sunucu sesi duyamasa bile dizini tutar.
Maksimum gizlilik için, sıfır meta veri toplamayı sağlamanın tek yolu aracıyı ortadan kaldırmaktır. Bağlantıyı yönetecek bir sunucu yoksa günlük yoktur. Günlük yoksa, gerçekleşen etkileşimin geçmişi de yoktur. Gazeteciler, gizlilik savunucuları veya gerçekten gölgede kalan bir sohbet isteyen herkes için bir araç geliştirmek istedim.
Hedef: Sıfır Altyapı
Hedef katıydı:
- Arka Uç Yok:Node.js yok, WebSockets yok, sinyal sunucusu yok.
- Kurulum Yok:Herhangi bir modern web tarayıcısında yerel olarak çalışması gerekiyordu.
- Yüksek Güvenlik:Bağlantı kurulumunun yerel olarak şifrelenmesi gerekiyordu, böylece bağlantı bağlantısı kesilse bile kullanılamaz hale gelirdi.
Her şeyi tek ve bağımsız bir pakette toplamaya karar verdim index.htmldosya. Yerel sabit diskinizden çalıştırabilirsiniz ve yine de mükemmel çalışacaktır.
Nasıl Çalışır: "Manuel Sinyal Verme" Mimarisi
Bunun nasıl çalıştığını anlamak için şuna bakmalıyız: WebRTC(Web Gerçek Zamanlı İletişim). WebRTC harikadır çünkü bir bağlantı kurulduğunda ses tamamen şifrelenmiş olarak cihazlar arasında doğrudan aktarılır.
Ancak WebRTC'nin meşhur bir tavuk-yumurta sorunu var: Sinyalizasyon. İki cihazın doğrudan bağlanabilmesi için önce SDP (Oturum Açıklama Protokolü) adı verilen ağ ayrıntılarını (IP adresleri, bağlantı noktaları, medya formatları) alışverişinde bulunmaları gerekir. Normalde geliştiriciler bu SDP verilerini ileri geri iletmek için merkezi bir sunucu oluştururlar.
"Sıfır Altyapı"ya ulaşmak için otomatik sinyalleme sunucusunu şununla değiştirdim: Manuel Sinyalleme ve Yerel Şifreleme.
İşte tam akış:
- Adım 1: Paylaşılan Sır.A Kullanıcısı ve B Kullanıcısı önceden (güvenli bir kanal aracılığıyla veya şahsen) güçlü bir şifre üzerinde anlaşırlar. Her ikisi de bu şifreyi uygulamaya girer.
- Adım 2: Teklifin Oluşturulması.A Kullanıcısının tarayıcısı WebRTC bağlantı verilerini oluşturur. Tarayıcı bunu bir sunucuya göndermek yerine, bu verileri paylaşılan parolaya dayalı olarak güvenli bir şekilde şifrelemek için (AES-GCM 256 bit kullanarak) yerel Web Kripto API'sini kullanır.
- Adım 3: Kopyala-Yapıştır Rölesi.A Kullanıcısı bu şifrelenmiş metin bloğunu kopyalar ve herhangi bir mesajlaşma uygulaması, SMS ve hatta e-posta aracılığıyla B Kullanıcısına gönderir.
- Adım 4: Şifre Çözme ve Cevap.B Kullanıcısı metni kendi uygulamasına yapıştırır. Tarayıcıları, şifreyi çözmek için paylaşılan şifreyi kullanır, bağlantıyı kabul eder, bir "Yanıt" oluşturur, bunu şifreler ve A Kullanıcısına geri gönderir.
- Adım 5: Doğrudan Bağlantı.A Kullanıcısı son yanıtı yapıştırdıktan sonra tarayıcılar doğrudan bir P2P bağlantısı kurar. Ses doğrudan aralarında akar.
Sinyal verileri yerel olarak yoğun şekilde şifrelendiğinden, metni kopyalayıp yapıştırmak için kullanılan mesajlaşma uygulamasının metnin ne anlama geldiğine dair hiçbir fikri yoktur.
Gerçek: Takaslar ve Sınırlamalar
Gerçek anlamda sunucusuz bir uygulama geliştirmek bana ağ gerçekleri hakkında çok şey öğretti. Sunucuyu kaldırarak belirli tavizleri kabul etmeniz gerekir:
- IP Görünürlüğü:Eşler arası tam olarak bu anlama gelir. Tarayıcılar doğrudan bağlanır; bu, Kullanıcı A ve Kullanıcı B'nin teknik olarak birbirlerinin IP adreslerini görebileceği anlamına gelir. Konuştuğunuz kişinin mutlak gizliliğine ihtiyacınız varsa bağlantınızı bir VPN üzerinden yönlendirmeniz gerekir.
- Kurumsal Güvenlik Duvarı Sorunu (Simetrik NAT):Bu proje, IP adreslerini bulmak için neredeyse tüm ev Wi-Fi ve mobil ağlarında mükemmel şekilde çalışan temel STUN sunucularını kullanıyor. Ancak her iki kullanıcı da katı kurumsal güvenlik duvarlarının arkasındaysa bağlantı kuramazlar. Standart uygulamalar bunu TURN sunucularını (medyayı aktaran) kullanarak çözer, ancak bir TURN sunucusu eklemek bu projenin tüm "sunucusuz" felsefesini boşa çıkaracaktır.
Son Düşünceler
Bunu oluşturmak, modern tarayıcıların sınırlarını zorlamak açısından inanılmaz bir egzersizdi. Her şey için sunucuları çalıştırmaya o kadar alışkınız ki, ancak bazen en güvenli sunucu var olmayan sunucudur.
- GitHub'daki koda göz atın: https://github.com/furkiak/secure-p2p-voice
Bu mimari hakkındaki düşüncelerinizi duymayı çok isterim. Hiç manuel WebRTC sinyallemesini veya Web Crypto API'yi denediniz mi? Yorumlarda tartışalım!