Signal Protokolü ile Uçtan Uca Şifreleme

Signal Protokolü nedir?

Signal Protocol (eski adıyla TextSecure Protocol), güvenli uçtan uca şifreleme (E2EE) için bir kriptografik şifreleme protokolüdür. Open Whisper Systems tarafından güvenli bir mesajlaşma uygulaması olan TextSecure’da kullanılmak üzere oluşturuldu, ancak o zamandan beri açık kaynak kodlu olarak insanlara sunuldu. Yaygın uygulamalar içerisinde çok fazla popüler oldu; mesajlaşma, sesli ve görüntülü iletişim için de facto standartı olarak kabul gördü. Yani bir piyasa standartı olarak kabul edilip büyük bir ün kazandı. Halkın mahremiyet, güvenlik ve gözetleme konusundaki endişelerinin artması dolayısıyla başta Google Allo, Facebook Messenger ve WhatsApp olmak üzere birçok firma ve organizasyon her geçen gün uçtan uca şifrelemeye (E2EE) daha fazla önem vermeye başladılar.

Basit bir ifadeyle, E2EE verilerimizin yalnızca hedeflenen alıcı için görünür olmasını sağlamamıza izin verir; veriler, kablo üzerinden gönderilmeden önce kullanıcının kendi cihazında istemcide şifrelenir. Yani bu demek oluyor ki ortadaki tüm altyapı (yönlendirme, mesajlaşma sunucuları, veritabanları vb.) verilerinizi asla ham haliyle göremeyecek! Ve bu harika -bu, istemci ve sunucu arasındaki güven unsurunu tamamen ortadan kaldırabileceğimiz anlamına geliyor- böylece kullanıcılar artık verilerinin mesajlaşma sağlayıcılarının elinde gerçekten güvenli olup olmadığı konusunda endişelenmek zorunda kalmazlar. Daha da önemlisi, tüm bunlar aktarım sırasında bir kullanıcının iletişimine müdahale etmeye çalışan herhangi bir üçüncü tarafın kesinlikle başarısız olacağı anlamına geliyor!

Bana bir örnek ver.

Örnek olarak, A kullanıcısının MindLink üzerinden B kullanıcısına bir mesaj göndermek istediğini varsayalım. İşte tipik bir Signal Protokolü veri alışverişi şöyle gerçekleşir:

1. A Kullanıcısı ve B Kullanıcısı ilk kez oturum açar ve yeni asimetrik anahtar çiftleri oluştururlar. Genel anahtarlarını bir sunucuda yayınlarlar.

2. A Kullanıcısı, B kullanıcısının anahtarlarını sunucudan indirir.

3. Yeni bir güvenli mesajlaşma oturumu başlatır.

4. Ardından mesajlar şifrelenir.

5. Mesajı MindLink üzerinden gönderir.

6. B Kullanıcısı mesajları alır ve mesajın şifresini çözerek uygun bir güvenli mesajlaşma oturumu başlatır.

Tamam, şimdi bunu biraz açalım…

1. MindLink’te ilk kez oturum açarken her kullanıcı birkaç anahtar seti üretir: uzun vadeli kimlik anahtarı çifti, orta vadeli işaretli bir ön anahtar çifti ve birkaç geçici anahtar. Bu çiftlerin genel anahtarları, prekey paketi olarak bilinen paket içinde paketlenmiştir. Bu paket daha sonra depolama ve dağıtım için bir Anahtar Değişimi sunucusuna (Key Exchange server) gönderilir.

2. A kullanıcısı, B kullanıcısına ilk kez bir mesaj göndermeye karar verir. A kullanıcısı, Anahtar Değişimi’nden B kullanıcısının hazır paketini talep ederek başlar.

3. Bununla birlikte A kullanıcısı, Genişletilmiş Üçlü Diffie-Hellman (X3DH) anahtar anlaşması protokolü olarak adlandırılan, hem kendi anahtarlarına hem de B kullanıcısının anahtarlarına dayalı olarak yeni bir oturum oluşturur.

Not: Kulağa çok basitmiş gibi geliyor olabilir ama burada hakkını vererek anlatabileciğimi düşünmüyorum. O yüzden XCDH ve Signal Protokolü’nü daha detaylı şekilde anlatan kendi resmî web sitelerine bakabilirsiniz: .

Diffie-Hellman (veya daha spesifik olarak eliptik eğri Diffie-Hellman) protokolü, güvenli olmayan bir kanal üzerinden iki taraf arasında paylaşılan bir sırrı türetmenin yeni bir yolunu açıklar. Üstün bir matematik kullanarak bazı halka açık verileri ve bazı gizli verileri paylaşan iki kullanıcının, bu verilere dayalı bir dönüşüm dizisini veri alışverişi edebileceği ve tamamen aynı sonuca -paylaşılan sır- ulaşabileceği gösterilebilir, fakat bu değiş tokuşu gözlemleyebilse bile hiç kimse aynı şeyi yapamaz! Bu paylaşılan sır, daha sonra iki kullanıcı arasında şifrelenmiş bir oturumun başlangıç noktası olur.

4. Kullanıcı A, yeni oturumunu kullanarak bir mesajı şifreler.

Bu, Signal Protokolü’nün, önceki veya gelecekten tamamen ayrılmış bir dizi benzersiz mesaj şifreleme anahtarını türetmenin bir yolunu elde etmek için iki tür ratchet’ı (simetrik anahtar ratchet ve Diffie-Hellman ratchet) birleştiren ünlü “Double Ratchet” algoritmasına dayanır. Bu, bir saldırganın Double Ratchet anahtarlarından birini tehlikeye atması durumunda diğer mesajların şifresini çözemeyeceği anlamına gelir. Signal’e süper-güvenlikli itibarını sağlayan, dinamik olarak gelişen kriptografinin bu özelliğidir.

Simetrik kilit iki simetrik anahtarı üretmek için Kullanıcı B’nin geçici anahtarlarıyla birlikte X3DH protokolünden paylaşılan gizli anahtarı kullanır: Bir kök (root) anahtarını (sadece Kullanıcı A ve Kullanıcı B’nin sahip olabileciği sır) ve bir gönderme zinciri anahtarı (sending chain key). Bu anahtarlar, gönderilen her mesaj için benzersiz mesaj anahtarları türetmek üzere bir anahtar türetme işlevinden (KDF) geçirilir. A kullanıcısı B kullanıcısına bir mesaj gönderdiğinde A kullanıcısı, anahtar zincirini bir adım ilerleterek yeni bir gönderme zinciri anahtarı ve bir mesaj şifreleme anahtarı (message encryption key) oluşturur ve bu mesajı aldıktan sonra B kullanıcısı, alma anahtar zincirini (receiving key chain) bir adım ilerletir ve ilgili mesaj şifre çözme anahtarını oluşturur. Bu iyidir ancak bir saldırgan, B kullanıcısının alma ve gönderme zincir anahtarını çalarsa, potansiyel olarak gelecekteki her mesaj anahtarını ve dolayısıyla gelecekteki her mesajı hesaplayabilir. İşte Double Ratchet’ın diğer yarısı burada devreye giriyor.

Diffie-Hellman ratchet, simetrik ratchet ile “iç içe” getirilir ve sonucunda periyodik olarak yeni alma-verme anahtar zincirlerini ve yepyeni bir kök anahtarını oluşturma sürecini başlatır. Bu demek oluyor ki, saldırganın çaldığı anahtarlar yalnızca bir kere iki-yönlü mesajlaşmadan sonra işlevsiz hale gelir (DH ratchet’ın “nokta” koyduğu yer)!

Bu kulağa oldukça karmaşık geliyor. Çünkü öyle! Sizi cesaretlendirmek isterim ki gerçekten gidip okumak isteyen herkesi bu konuyu çok teknik ve çok derinlemesine inceleyen Signal analizine davet ediyorum.

Mesajın kendisi, her aşamada DH ratchet’ın çıktıları ile birlikte şifrelenmiş ciphertext’i (algoritma ile şifrelenmiş plain text çıktısı) ve alıcının alıcı anahtar zincirini doğru şekilde ilerletmesi için bazı ek bilgileri içerir. Ancak bu aynı zamanda özel bir durumdur, yeni bir oturumda gönderilen ilk mesajla birlikte Kullanıcı A, aynı zamanda ön paketini şifrelenmiş mesaja bağlar, böylece Kullanıcı B tamamlayıcı bir oturum türetebilir.

5. Kullanıcı A, şifrelenmiş yükle dolu mesajı (payload) kablo üzerinden gönderir!

6. Kullanıcı B, şifrelenmiş mesaj yükünü (payload) alır. Mesaj için uygun bir oturuma sahip olmadıklarını bilirler, ancak mesaja iliştirilmiş bir hazırlık paketi olduğunu ve onunla bir tane kurabileceklerini fark ederler. Kullanıcı A gibi 3. ve 4. adımları geçen Kullanıcı B, karşısında şifresi çözülmüş saf metni (plaintext) bulur.

Sonuç olarak

İşte bu kadar! Burada birçok ayrıntı atlanmıştır, ancak umarız ki, tipik bir Sinyal Protokolü işleminde görmeyi bekleyebileceğiniz akış ve süreç türlerine iyi bir genel bakış sunabilmișizdir. Signal’e başlamak için buradan API’lerine bakabilirsiniz.

Şu anda C, JavaScript ve Java destekleri bulunuyor. Protokolün uygulanmasına ilişkin daha fazla ilgi için, GitHub’da bulabileceğiniz JavaScript Signal API’lerini kullanarak tarayıcı tabanlı basit bir demo oluşturdum. Bu demo iki tane “kullanıcı” oluşturuyor ve bu makalede belirtilen adımlarla aralarında mesajlaşmayı başlatıyor. İyi eğlenceler!

Kaynak

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu web sitesi gizliliğinizi ihmal etmeyecek şekilde çerezler kullanır.