Sıfır Bilgi Şifreleme: Vaulted Sırlarını Nasıl Gizli Tutar
Yazan Maxim Novak
Sıfır bilgi şifreleme, sunucunun düz metnini veya şifreleme anahtarlarını hiç görmediği anlamına gelir. Vaulted bunu, herhangi bir veri sunucuya ulaşmadan önce her sırrı tarayıcında AES-256-GCM ile şifreleyerek gerçekleştirir. Sunucu yalnızca şifreli metni saklar — yalnızca URL fragment'ında yaşayan şifre çözme anahtarına hiçbir zaman erişimi yoktur.
Bu yazı tam kriptografik uygulamayı adım adım açıklıyor: anahtarlar nasıl üretilir, veriler nasıl şifrelenir, anahtar alıcıya nasıl ulaşır ve bir parola eklediğinde ne olur. Buradaki her ayrıntı, tarayıcında çalışan gerçek kodu yansıtmaktadır.
İstemci taraflı şifrelemenin neden önemli olduğuna dair genel bir bakış için istemci taraflı şifreleme üzerine daha önceki yazımıza bakabilirsin. Bu yazı kriptografik temellere daha derinlemesine iniyor.
Anahtar üretimi
Bir sır oluşturduğun her seferinde Vaulted, Web Crypto API'yi kullanarak yeni bir AES-256-GCM şifreleme anahtarı üretir:
crypto.subtle.generateKey({ name: 'AES-GCM', length: 256 }, true, [
'encrypt',
'decrypt',
]);
Dikkat edilmesi gereken birkaç nokta:
- AES-GCM (Galois/Counter Mode) hem gizlilik hem de bütünlük sağlar — yalnızca yetkisiz okumayı değil, aynı zamanda kurcalamayı da tespit eder.
- 256 bitlik anahtar uzunluğu, AES için mevcut en güçlü seçenektir ve dünya genelinde hükümetler ile finans kuruluşları tarafından kullanılmaktadır.
- Extractable:
true— anahtar, alıcı için URL fragment'ına yerleştirilebilmesi amacıyla ham baytlar olarak dışa aktarılabilir.
Web Crypto API, tarayıcının yerel kriptografik motoruna (örn. Chromium'da BoringSSL, Firefox'ta NSS) delege eder. Anahtar bellekte güvenli biçimde üretilir; diske veya ağa hiç dokunmaz.
Şifreleme
Anahtar üretildikten sonra Vaulted düz metni şifreler:
const iv = crypto.getRandomValues(new Uint8Array(12));
crypto.subtle.encrypt(
{ name: 'AES-GCM', iv },
key,
new TextEncoder().encode(plaintext),
);
Başlatma vektörü (IV): AES-GCM, her şifreleme işlemi için 12 baytlık (96 bit) rastgele bir IV gerektirir. IV'nin gizli olması gerekmez — şifreli metinle birlikte saklanır — ancak aynı anahtarla asla yeniden kullanılmamalıdır. Vaulted her sır için yeni bir anahtar ürettiğinden, IV'nin yeniden kullanılması tasarım gereği imkânsızdır.
Kodlama: Hem şifreli metin hem de IV, base64url dizesi olarak kodlanır (standart base64'te + yerine -, / yerine _ kullanılır ve sondaki = kaldırılır). Bu, URL'lerde ve JSON payload'larında güvenle kullanılmalarını sağlar.
Şifreli metin ve IV, depolama için sunucuya gönderilir. Düz metin tarayıcıyı hiç terk etmez.
URL fragment ile anahtar iletimi
Şifrelemeden sonra anahtar dışa aktarılır ve # işaretinin ardındaki kısım olan URL fragment'ına yerleştirilir:
const rawKey = await crypto.subtle.exportKey('raw', key);
// rawKey → base64url-encoded string
Ortaya çıkan şifreli paylaşım bağlantısı şöyle görünür:
https://vaulted.fyi/s/abc123#dGhpcyBpcyBhIGtleQ
^^^^^^^^^^^^^^^^^^^^^^^^
encryption key (base64url)
# ayracı kritik öneme sahiptir. RFC 3986 uyarınca fragment tanımlayıcısı tamamen istemci tarafından işlenir. Tarayıcılar fragment'ı hiçbir zaman HTTP isteğine dahil etmez — ne URL'de, ne Referer başlığında, ne de sunucunun görebileceği herhangi bir yerde.
Alıcı bağlantıyı açtığında:
- Tarayıcı sunucudan
/s/abc123'ü ister (fragment olmadan) - Sunucu şifreli metni ve IV'yi döndürür
- JavaScript, fragment'ı
window.location.hash'ten okur - Anahtar Web Crypto API'ye yeniden aktarılır
- Şifreli metin yerel olarak çözülür
Sunucu, şifreli blob'un depolanmasını ve alınmasını sağlar. Kriptografik işlemlere hiçbir zaman katılmaz.
İsteğe bağlı parola koruması
Ek koruma gerektiren sırlar için Vaulted, parola tabanlı anahtar sarmalama desteği sunar. Bu, ikinci bir katman ekler: biri bağlantıyı ele geçirse bile, parolası olmadan sırrı çözemez.
Anahtar türetme ile PBKDF2
Bir parola belirlediğinde Vaulted, PBKDF2 kullanarak bir sarmalama anahtarı türetir:
crypto.subtle.deriveKey(
{
name: 'PBKDF2',
salt, // 16 bytes, randomly generated
iterations: 600_000,
hash: 'SHA-256',
},
keyMaterial, // the passphrase, imported as raw key material
{ name: 'AES-KW', length: 256 },
false,
['wrapKey', 'unwrapKey'],
);
- 600.000 iterasyon, kaba kuvvet saldırılarını hesaplama açısından maliyetli kılar.
- 16 baytlık rastgele salt, aynı parolaların farklı sırlarda farklı türetilmiş anahtarlar üretmesini sağlar.
- SHA-256, her PBKDF2 iterasyonunda kullanılan özet fonksiyonudur.
- Türetilen anahtar, AES-GCM anahtarı değil, bir AES-KW (AES Key Wrap, RFC 3394) anahtarıdır. Anahtar sarmalama, şifrelemeden ayrı bir işlemdir.
Şifreleme anahtarını sarmalamak
Türetilen AES-KW anahtarı, orijinal şifreleme anahtarını sarar:
crypto.subtle.wrapKey('raw', encryptionKey, wrappingKey, 'AES-KW');
URL fragment artık hem sarmalanmış anahtarı hem de salt'ı nokta ile ayrılmış biçimde içerir:
#wrappedKeyBase64url.saltBase64url
Şifre çözme sırasında sarmalı açmak
Alıcı parolayı girdiğinde Vaulted işlemi tersine çevirir:
- Sarmalanmış anahtarı ve salt'ı elde etmek için fragment
.üzerinden bölünür - Aynı AES-KW sarmalama anahtarı, parola ve salt kullanılarak PBKDF2 ile türetilir
- Şifreleme anahtarı
crypto.subtle.unwrapKeyile açılır - Şifreli metin, açılan AES-GCM anahtarıyla çözülür
Parola yanlışsa unwrapKey hata fırlatır — kısmi şifre çözme veya bilgi sızıntısı olmaz.
Şifre çözme akışı
Parola olmaksızın şifre çözme işlemi basittir:
- Anahtarı URL fragment'ından içe aktar (
crypto.subtle.importKey) - Şifreli metni IV ile çöz (
crypto.subtle.decrypt) - Düz metni UTF-8 baytlarından dönüştür
Parola ile:
- Sarmalanmış anahtarı ve salt'ı çıkarmak için fragment'ı böl
- Paroladan ve salt'tan sarmalama anahtarını türet (PBKDF2)
- Şifreleme anahtarının sarmalını aç (AES-KW)
- Şifreli metni çöz (AES-GCM)
- Düz metni dönüştür
Bunların hepsi tarayıcıda gerçekleşir. Sunucu yalnızca şifreli blob'u ve meta verileri (görüntülenme sayısı, son kullanma tarihi) döndürür — bundan fazlasını değil.
Tehdit modeli
Hiçbir güvenlik aracı her şeye karşı koruma sağlamaz. Vaulted'ın mimarisinin hangi tehditlere karşı tasarlandığı ve kapsamı dışında kalanlar şunlardır.
Vaulted'ın koruduğu tehditler
- Sunucu ele geçirilmesi — Sunucu yalnızca şifreli metni saklar. Anahtar olmadan (ki sunucuya hiç gönderilmez) veriler okunamaz. Tam bir veritabanı dökümü yalnızca şifreli blob'lar verir.
- Veritabanı ihlali — Yukarıdakiyle aynı. AES-256-GCM ile anahtarsız şifreli metin hesaplama açısından işe yaramaz.
- Sunucu tarafında ortadaki adam saldırısı — Şifreleme anahtarı, HTTP isteklerinde hiç iletilmeyen URL fragment'ında yaşar. TLS, aktarım sırasında şifreli metni korur.
- Hizmet operatörlerinin sırları okuması — Sıfır bilgi tam olarak bunu ifade eder. Anahtarlara sahip olmadığımız için, zorlanmış olsak bile sırlarını okuyamayız.
Vaulted'ın KORUMADIKLARI
- Ele geçirilmiş tarayıcı veya cihaz — Alıcının cihazında kötü amaçlı yazılım veya keylogger varsa, şifre çözme sonrasında düz metin yakalanabilir.
- Kötü amaçlı tarayıcı eklentileri — Sayfa erişimine sahip eklentiler, şifre çözme sonrasında açığa çıkan sır da dahil olmak üzere DOM'u okuyabilir.
- Bağlantı ele geçirilmesi — URL, fragment'ta şifreleme anahtarını içerir. Tam URL'yi (fragment dahil) ele geçiren herkes sırrı çözebilir. Bağlantıları güvenli kanallar üzerinden paylaş.
- Omuz sörfü — Sır ekranda gösterildikten sonra izleyen herkes onu görebilir.
- Alıcının davranışı — Şifre çözme sonrasında alıcı ekran görüntüsü alabilir, kopyalayabilir veya düz metni paylaşabilir. Vaulted bunu engelleyemez.
Parola özelliği, bağlantı ele geçirilmesi riskini azaltır: tam URL'ye sahip olunsa bile saldırganın yine de parolaya ihtiyacı vardır. Derinlemesine savunma için parolayı farklı bir kanaldan paylaş (bir telefon görüşmesi, ayrı bir mesaj).
Özet
Vaulted'ın sıfır bilgi şifrelemesi şu anlama gelir:
- Her sır için yeni bir AES-256-GCM anahtarı üretilir
- Şifreleme tamamen tarayıcında gerçekleşir
- Sunucu yalnızca şifreli metni saklar
- Şifre çözme anahtarı yalnızca URL fragment'ında bulunur; tarayıcılar bunu hiçbir zaman sunuculara göndermez
- İsteğe bağlı parola sarmalama, PBKDF2 ve AES-KW aracılığıyla ikinci bir katman ekler
Sonuç: tüm sunucular, veritabanları ve ağ yolları aynı anda ele geçirilmiş olsa bile sırların şifreli kalır. Anahtarlar yalnızca paylaştığın bağlantılarda yaşar.
Bir sırrı güvenle paylaşmaya hazır mısın? Vaulted'da bir sır oluştur — 10 saniye sürer.
İlgili içerikler
- Vaulted'da güvenlik — güvenlik modelimizin özeti
- İstemci Taraflı Şifreleme Neden Önemlidir — tarayıcıda şifrelemenin önemi
- Şifreleme Playground'u — AES-256-GCM şifrelemesini adım adım izle