Güncellendi

Sıfır Bilgi Şifreleme: Vaulted Sırlarını Nasıl Gizli Tutar

Yazan

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:

  1. Tarayıcı sunucudan /s/abc123'ü ister (fragment olmadan)
  2. Sunucu şifreli metni ve IV'yi döndürür
  3. JavaScript, fragment'ı window.location.hash'ten okur
  4. Anahtar Web Crypto API'ye yeniden aktarılır
  5. Ş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:

  1. Sarmalanmış anahtarı ve salt'ı elde etmek için fragment . üzerinden bölünür
  2. Aynı AES-KW sarmalama anahtarı, parola ve salt kullanılarak PBKDF2 ile türetilir
  3. Şifreleme anahtarı crypto.subtle.unwrapKey ile açılır
  4. Ş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:

  1. Anahtarı URL fragment'ından içe aktar (crypto.subtle.importKey)
  2. Şifreli metni IV ile çöz (crypto.subtle.decrypt)
  3. Düz metni UTF-8 baytlarından dönüştür

Parola ile:

  1. Sarmalanmış anahtarı ve salt'ı çıkarmak için fragment'ı böl
  2. Paroladan ve salt'tan sarmalama anahtarını türet (PBKDF2)
  3. Şifreleme anahtarının sarmalını aç (AES-KW)
  4. Şifreli metni çöz (AES-GCM)
  5. 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:

  1. Her sır için yeni bir AES-256-GCM anahtarı üretilir
  2. Şifreleme tamamen tarayıcında gerçekleşir
  3. Sunucu yalnızca şifreli metni saklar
  4. Şifre çözme anahtarı yalnızca URL fragment'ında bulunur; tarayıcılar bunu hiçbir zaman sunuculara göndermez
  5. İ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