
SSP aktarıcısı neyi görebilir, neyi göremez
SSP iki cihazlı bir cüzdandır. Tarayıcı eklentiniz bir anahtarı, telefonunuz ötekini tutar ve hiçbiri tek başına para kıpırdatamaz. Ama bu iki cihazın birbiriyle konuşması gerekir ve bunu, bizim işlettiğimiz ve aktarıcı dediğimiz bir sunucu üzerinden yaparlar.
O sunucu, rahatsız edici bir soruyu sormak için apaçık bir yer: her şey cüzdan şirketinin işlettiği altyapıdan geçiyorsa, o şirket tam olarak neyi görüyor?
Bu haklı bir soru ve yatıştırıcı değil, belirli bir yanıtı hak ediyor. İşte kodun içinde gerçekte ne olduğu.
Aktarıcı hiçbir şeyi imzalayamaz
En çok önem taşıyan yerden başlayalım.
Aktarıcı hiçbir zaman özel anahtar almaz. Şifreli de değil, bölünmüş de değil, hiçbir biçimde. Cüzdan anahtarınız tarayıcı eklentinizde, anahtar uygulamanızın anahtarı telefonunuzda kalır; ağı aşan tek şeyler açık anahtarlar, imzalanmamış veriler ve halihazırda cihazlarınızda üretilmiş imzalardır.
Bu bir politika taahhüdü değil, yapısal bir taahhüttür. İki-of-iki çoklu imza parayı kıpırdatmak için iki imzayı da ister ve aktarıcıda anahtarların hiçbiri yoktur. Tümüyle kötü niyetli bir aktarıcı — bizimki, ele geçirilmişi ya da bir saldırganca değiştirilmişi — yine de geçerli bir işlem üretemez, çünkü üretmek kendisine hiç gönderilmemiş sırları gerektirir.
Güvence budur. Aşağıdaki her şey, aktarıcının gerçekten elinden geçirdiği şeyle ilgili: daha dar ama gerçekten boş olmayan bir küme.
Ne geçer ve ne kadar süreyle
Aktarıcı dört tür kayıt tutar. İkisi kendini siler.
Eşitleme verisi, iki cihazınızı eşlerken. Zinciri, cüzdan kimliğinizi, anahtar uygulamasının genişletilmiş açık anahtarını, ortaya çıkan WK kimliğini, açık nonce’ları, üretilen adresi ve imzasıyla birlikte kurtarma xpub’ını taşır.
Eylem verisi, bir şey imzalarken. Zinciri, türetme yolunu, WK kimliğinizi, eylem türünü, yükün kendisini ve ilgili UTXO’ları taşır.
Bu iki derlemin de MongoDB’de expireAfterSeconds: 900 olarak ayarlanmış bir TTL dizini vardır. On beş dakika. Başka ne olursa olsun veritabanı kaydı siler — birinin çalıştırmayı hatırlaması gereken bir temizlik işi değil, gizlilik ilkesindeki bir söz de değil. Bir dizin; veritabanının kendisi dayatıyor.
Anlık bildirim jetonları, onaylanacak bir şey olduğunda telefonunuz uyandırılabilsin diye. Bunlar kalıcıdır, çünkü on beş dakikada bir sona eren bir bildirim jetonu işe yaramazdı.
Kurtarma xpub’ı, kimlik başına bir tane, hiç sona ermeden. Bu bilinçlidir ve kod bunu söyler: yalnızca iki uygulamanın rastlantıyla uyanık olduğu kısa aralıklarda değil, cüzdan ne zaman ihtiyaç duyarsa alabilsin diye vardır.
Açık sözlü olmamız gereken kısım
Şu eşitleme yüküne bir daha bakın. İçinde bir genişletilmiş açık anahtar var.
Bir xpub harcama anahtarı değildir ve bir işleme yetki veremez. Ama hiçbir şey de değildir. Bir hesap xpub’ından o hesabın kullanacağı her adres türetilebilir; yani onu elinde tutan, o zincirdeki tüm bakiyeyi ve işlem geçmişini izleyebilir. Bu, o hesaptaki mali yaşamınıza okuma erişimidir — zincir üstü gizliliğin kaçınmaya dayandığı bağlantının ta kendisi.
Eylem yükü de aynı ölçüde gerçek. Siz imzalarken aktarıcı imzalanmamış işlemi elinde tutar: paranın nereye gittiğini, ne kadar olduğunu ve hangi çıktılardan geldiğini.
Yani dürüst özet “aktarıcı hiçbir şey görmez” değil. Şöyle:
Aktarıcı paranızı harcayamaz ve her seferinde on beş dakika boyunca onunla ne yaptığınızı görebilir.
On beş dakikalık pencere hafifletmedir ve anlamlı bir hafifletmedir — tek bir yerde ne kadar geçmiş birikebileceğini sınırlar. Ama o pencere boyunca veri oradadır ve bunu açıkça söylemeyi, “saklamasız” sözcüğünün hak etmediği retorik işi görmesine izin vermeye yeğleriz.
Ödünç almaya değer tasarım ilkesi
Kurtarma hizmetinde, mimariyi herhangi bir şemadan daha iyi yakalayan bir yorum var:
cüzdan o imzayı kendi türettiği kimlik açık anahtarına karşı doğrular, dolayısıyla bu depoya güvenilmez.
Kurtarma xpub’ı, SSP Key’in onun üzerine attığı ayrık bir imzayla birlikte saklanır. Cüzdan onu aldığında kimlik açık anahtarını bağımsız olarak türetir ve imzayı kendisi denetler. Aktarıcı farklı bir xpub döndürseydi — ele geçirilme, bir hata ya da kasıtlı değiştirme yoluyla — imza doğrulanmaz ve cüzdan onu reddederdi.
Aktarıcı, ona dayanan yazılım tarafından güvenilmeyen bir boru gibi ele alınır. Kendi işlettiğiniz altyapının üstüne bunun üzerine inşa etmek doğru yoldur, çünkü kendi sunucunuzun yanılması kullanıcılarınızın sorununa dönüşmez demektir. Aynı zamanda herhangi bir cüzdanı değerlendirirken aranacak örüntüdür: “iyi davranmaya söz veriyorlar mı?” değil, “sunucuları kötü davranırsa ne olur?”.
Düşmanca bir aktarıcı gerçekte ne yapabilirdi
Gerçek tehdit modeli konusunda somut olmakta yarar var.
Gözleyebilirdi. TTL penceresi içinde xpub’ınızı ve bekleyen işleminizi. Bu bir gizlilik açığıdır, hırsızlık riski değil.
Sansürleyebilirdi. Cihazlarınız arasındaki iletileri geçirmeyi reddederek, olağan akışla yeni işlemler imzalamanızı durdururdu. Can sıkıcı ve aksatıcı — ve bir şey yitirmekle aynı şey değil. Anahtarlarınız yine sizindir, paranız yine zincirdedir ve kurtarma yolları tam da aktarıcı orada olmayabileceği için vardır.
Yalan söyleyebilir ve çoğunlukla başarısız olurdu. Bir kurtarma xpub’ını değiştirmeyi, yukarıda anlatılan imza denetimi boşa çıkarır. Bu doğrulamanın önemi buradan gelir.
İmzalayamaz. Anahtar yok, imza yok, işlem yok.
Gerçekçi en kötü durum gözetim ve aksamadır, kayıp değil. Bu, en kötü durumun paranın gitmiş olması anlamına geldiği saklamalı bir hizmete göre belirgin biçimde daha iyi bir konumdur. “Kimse hiçbir şey göremez” ile aynı şey değildir ve ikisini birbirine karıştırmak, insanların kendi gizlilikleri hakkında yanlış bir resme sahip olmasının yoludur.
Görünen kısımlar için yapabilecekleriniz
Eşlemenin neyi açığa çıkardığını anlayın. Bir zinciri eşitlemek, o zincire ait bir xpub’ın aktarıcıdan geçmesi demektir. İki cihazlı tasarımın çalışmasının bedeli budur.
Pencerenin kısa olduğunu ama sıfır olmadığını unutmayın. Eylem başına on beş dakika bir sınırdır, bir yokluk değil.
Kurtarma xpub’ını kalıcı sayın. Tasarım gereği sona ermeden saklanır ve doğrulanabilir imzası olan açık anahtar malzemesidir — ama kalıcıdır ve bunu keşfetmektense bilmeniz gerekir.
Güvenceyi değil mimariyi yargılayın. Herhangi bir cüzdanın sunucusu hakkındaki yararlı soru, şirketin ağzı sıkılık vaat edip etmediği değildir. Sunucu yalan söylediyse yazılımın bunu fark edip etmeyeceğidir. Bizimki yanıtlara güvenmek yerine imzaları denetler ve bunu sözümüze inanmak yerine kodda okuyabilirsiniz.
En çok anlaşılmasını istediğimiz şey bu takasın biçimi. İki cihazlı bir cüzdan bir eşgüdüm kanalına ihtiyaç duyar ve eşgüdüm kanalı, üst verinin biriktiği bir yerdir. Bunu veritabanının dayattığı bir sona erme ile sınırladık ve istemcileri sunucudan kuşku duyacak biçimde tasarladık — ama dürüst hâli şu: aktarıcı gerçek şeyleri, kısa süreliğine, görüyor ve hiçbir özenli mimari bu sayıyı sıfır yapmıyor.


