Dosya Transferi İçin Uçtan Uca Şifreleme Nasıl Çalışır
Uçtan uca şifrelemenin transfer sırasında dosyalarınızı nasıl koruduğunu anlayın. Kriptografik protokoller ve uygulamaya teknik bir derinlemesine bakış.
Uçtan uca şifreleme (E2EE), verinin yalnızca gönderen ve alıcı tarafından okunabilmesini garanti eder; aradaki hiçbir taraf — servis sağlayıcı, CDN, bulut depolama veya hükümet kurumu — şifreli metni çözemez. Bu, TLS'den farklıdır: TLS, tarayıcı ile sunucu arasındaki bağlantıyı şifreler, ancak sunucunun düz metni görmesini engellemez. E2EE ise şifreleme anahtarlarını sunucudan tamamen uzak tutar. Dosya transferi uygulamaları için bu ayrım kritiktir — sunucu ihlali, içerik sızdırmaz çünkü sunucuda şifresi çözülmüş içerik hiç bulunmaz.
E2EE'nin Savunduğu Tehdit Modeli
E2EE'nin neyi koruduğunu ve neyi korumadığını anlamak gerekir. Koruduğu tehditler: bekleyen ve aktarılan veriye sunucu tarafı erişim, veri ihlalleri (saldırgan şifreli blob'lar çalar, ancak anahtarlara ulaşamaz), yetkisiz hükümet talepleri (sunucu operatörü şifre çözemez, teslim edecek bir şey yoktur) ve MitM saldırıları (doğru uygulandığında). Korumadığı durumlar: uç nokta uzlaşması (birinin cihazı ele geçirilirse anahtarlar da ele geçirilir), meta veri (kim kiminle iletişim kurduğu genellikle görünür), zayıf parolalar ve doğrulanmamış anahtar değişimi. Tehdit modelinize göre E2EE değer sağlayıp sağlamadığına karar verebilirsiniz.
Simetrik Şifreleme: AES-256-GCM ve XChaCha20-Poly1305
Gerçek dosya baytları simetrik bir şifreyle şifrelenir. İki seçenek öne çıkar:
AES-256-GCM: Donanım hızlandırmalı (AES-NI), 256 bitlik anahtar, 96 bitlik nonce, 128 bitlik kimlik doğrulama etiketi. Tarayıcılar, mobil ve sunucularda evrensel donanım desteği. Web Crypto API ile standart seçim.
XChaCha20-Poly1305: 256 bitlik anahtar, 192 bitlik nonce (AES-GCM'in 96 bitine karşı büyük nonce — yeniden kullanım riskini azaltır), AES-NI olmayan donanımda daha hızlı. Libsodium'un tercih ettiği primitif.
Her ikisi de AEAD (Kimlik Doğrulamalı Şifreleme ile İlişkili Veri) sağlar — şifreleme ve bütünlük tek geçişte gerçekleşir. Birini seçin ve tutarlı kalın. AES-GCM, Web Crypto aracılığıyla tarayıcı ortamlarında daha az bağımlılıkla uygulanır; libsodium.js kullanıyorsanız XChaCha20-Poly1305'i tercih edin.
Parolalardan Anahtar Türetme
Kullanıcılar anahtar değil parola hatırlar. PBKDF2-HMAC-SHA256, Argon2id ve scrypt, parolayı kriptografik anahtara dönüştürür ve kaba kuvvet saldırısını hesaplama açısından maliyetli hale getirir.
PBKDF2-HMAC-SHA256: RFC 2898, Web Crypto API'de yerleşik. 2024 OWASP önerisi 600.000 iterasyon; her yıl yaklaşık %20 artırın. GPU'lara karşı zayıf, ancak kullanımı kolay ve geniş platform desteği var.
Argon2id: RFC 9106, Password Hashing Competition kazananı. Bellek sertleştirmeli (GPU'ya karşı üstün). Önerilen parametreler: 64 MB bellek, 3 iterasyon, 4 paralel iş parçacığı. Tarayıcıda yerleşik değil — argon2-browser veya WASM uygulaması gerekir.
scrypt: RFC 7914, N=2^17, r=8, p=1 tipik parametreler. Argon2id'den eski ama iyi test edilmiş. libsodium aracılığıyla kullanılabilir.
Pratik seçim: Node.js arka ucu veya libsodium varsa Argon2id; salt Web Crypto kullanıyorsanız PBKDF2-HMAC-SHA256 (yüksek iterasyonla).
Açık Anahtar Sarmalama ile X25519 ECDH
Parola tabanlı olmayan sistemlerde — iki tarafın her biri bir anahtar çifti oluşturur — ECDH anahtar anlaşması bir paylaşılan sır üretir. X25519 (Curve25519 üzerinde ECDH), pratik açık anahtar kriptografisi için tercih edilen eğridir: küçük anahtar boyutu (32 bayt), yüksek hız, sabit zamanlı uygulama, yan kanal saldırısı direnci.
Akış:
- Gönderen geçici bir X25519 anahtar çifti oluşturur.
- Alıcının uzun vadeli X25519 açık anahtarını alır (bant dışı doğrulanmış).
- ECDH ile paylaşılan sır türetilir.
- Paylaşılan sırdan HKDF-SHA256 ile dosya şifreleme anahtarı türetilir.
- Dosya AES-256-GCM veya XChaCha20-Poly1305 ile şifrelenir.
- Şifreli dosya + geçici açık anahtar alıcıya gönderilir.
- Alıcı kendi özel anahtarı ve gönderenin geçici açık anahtarıyla ECDH yaparak aynı paylaşılan sırra ulaşır.
Geçici anahtar çiftleri ileri gizlilik sağlar: geçmiş bir mesaj kaydedilmiş olsa bile, uzun vadeli özel anahtar ele geçirilirse eski mesajlar şifresi çözülemez.
Bağlantı Tabanlı E2EE: URL Fragment Tekniği
HexaTransfer gibi anonim dosya transfer servisleri, paylaşılan bağlantıya şifreleme anahtarını gömer. URL fragment'ı (# sonrası her şey) tarayıcı tarafından sunucuya gönderilmez — bu, anahtarın sunucu günlüklerine, analizlere veya proxy'lere asla ulaşmaması demektir.
https://hexatransfer.com/d/AbCdEfGh#base64url-encoded-key
Alıcı bağlantıyı açtığında, JavaScript fragment'ı ayrıştırır, anahtarı Base64url'den çözer ve şifreleme anahtarı olarak kullanır. Sunucu yalnızca AbCdEfGh tanımlayıcısını görür; anahtarı asla görmez. Saldırgan sunucuyu ele geçirse bile şifreli metin işe yaramaz bir blob'dan ibarettir.
Bu yaklaşımın sınırlaması: bağlantıyı alan herkes dosyayı indirebilir. Alıcıya özgü erişim kontrolü istiyorsanız bağlantıya ek parola koruma veya alıcının açık anahtarıyla şifreleme ekleyin.
AEAD ve Karma ile Bütünlük
Şifreleme gizliliği sağlar; bütünlük, şifreli metnin kurcalanmadığını doğrular. AES-GCM ve ChaCha20-Poly1305'in AEAD yapısı her ikisini birlikte sağlar — şifre çözme başarısız olursa kimlik doğrulama etiketi eşleşmemiş demektir ve veri reddedilir.
Ek katman için dosyanın SHA-256 veya BLAKE3 karması şifreli metinden ayrı olarak depolar ve indirme sırasında doğrulanır. BLAKE3, SHA-256'dan 10 kat daha hızlıdır ve büyük dosyalar için tercih edilir. Karma, metadata'ya (dosya adı, boyut, son kullanma tarihi) de uygulanabilir — metadata imzalama, şifre çözme anahtarının geçerli içerikle eşleştiğini doğrular.
Büyük Dosyalar için Parçalı Şifreleme
Monolitik şifreleme büyük dosyalarda pratik değildir: 10 GB'lık dosyayı tek seferde belleğe sığdırmak mümkün değildir. Parçalı şifreleme her parçayı bağımsız olarak şifreler ve bellek kullanımını sabit tutar.
Doğru parça şifrelemesi için:
- Her parçanın kendi nonce'u olmalı — nonce yeniden kullanımı AES-GCM'i tamamen kırar
- Parça indeksi ve toplam parça sayısı AAD'ye (ilişkili veri) eklenmeli — saldırganların parçaları yeniden sıralamasını önler
- Kök anahtardan parça başına anahtar türetmek için HKDF kullanın:
HKDF-SHA256(rootKey, "chunk-" + index)
async function encryptChunk(rootKey, chunkIndex, totalChunks, plaintext) {
const chunkKey = await deriveChunkKey(rootKey, chunkIndex);
const nonce = crypto.getRandomValues(new Uint8Array(12));
const aad = new TextEncoder().encode(`${chunkIndex}/${totalChunks}`);
const ciphertext = await crypto.subtle.encrypt(
{ name: 'AES-GCM', iv: nonce, additionalData: aad },
chunkKey,
plaintext
);
return { nonce, ciphertext };
}
Şifre çözme sırasında tüm parçaların mevcut ve doğru sırada olduğunu doğrulayın — düz metni serbest bırakmadan önce.
TLS 1.3 ile E2EE'nin Birlikte Çalışması
E2EE ile TLS çelişmez — katmanlanır. TLS 1.3, ağ katmanı aktarım gizliliği sağlar: bağlantının kendisi şifreli, sertifikalar kontrol edilir, MitM saldırıları tespit edilir. E2EE uygulama katmanı koruması ekler: sunucu TLS'yi sonlandırsa bile şifrelenmiş içeriği göremez.
TLS olmadan E2EE uygulamak, TLS'nin sağladığı sunucu kimlik doğrulamasını ve aktarım düzeyindeki korumayı kaybetmek demektir. Her zaman ikisi birlikte kullanın.
Yaygın Uygulama Hataları
Nonce yeniden kullanımı: AES-GCM'de aynı anahtar ile nonce kombinasyonunu iki kez kullanmak hem gizliliği hem kimlik doğrulamayı tamamen bozar. Her şifreleme işlemi için crypto.getRandomValues() ile 96 bitlik rastgele nonce üretin. İç sayaç nonce'ları düşünülebilir ancak taşma riskine karşı dikkatli olun.
Ev yapımı kriptografi: Standart dışı şifreleme, özel protokoller veya kendi imzalama şemalarını uygulamak. Web Crypto API, libsodium veya TweetNaCl kullanın — incelenmiş ve test edilmiş kütüphaneler.
Kimlik doğrulanmamış metadata: Dosya adını, boyutunu ve türünü şifreli blobu imzalamadan açık metin olarak saklamak. Saldırgan metadata'yı değiştirerek alıcıyı yanıltabilir. Metadata'yı AEAD AAD alanına ekleyin veya ayrıca imzalayın.
Güvenilmeyen rastgelelik: Math.random() kriptografik amaçla asla kullanılmaz. Anahtar, nonce ve tuz üretimi için her zaman crypto.getRandomValues() kullanın.
Anahtar sızıntısı: Anahtarı URL parametresi olarak göndermek (sunucu günlükleri yakalar), yerel depolamada saklamak (XSS okur) veya console.log ile kaydetmek. Anahtarlar bellek içinde kalmalı, URL fragment veya güvenli kanal aracılığıyla iletilmeli.
Bir Servisin Gerçekten E2EE Yapıp Yapmadığını Doğrulama
Şifreleme iddiası kolay, doğrulama zor. Kontrol edilecekler:
- Açık kaynak istemci: JavaScript kodu incelenebilir olmalı. Minified kod gizlenmiştir, gerçek doğrulama için kaynak haritaları veya orijinal kaynak gerekir.
- Ağ trafiği: DevTools Network panelinde yükleme sırasında düz metin veya Base64 içerik gönderilip gönderilmediğini kontrol edin. Gerçek E2EE'de yalnızca şifreli metin ağa gider.
- Sunucu erişimi: Servis sağlayıcı içeriğinizi şifresi çözülmüş olarak görebiliyor mu? "Şifreleme" iddiasıyla sunucu tarafı şifreleme yapan servisler vardır — bu E2EE değildir.
- Anahtar konumu: Şifreleme anahtarı sunucuya gönderiliyor mu? Bağlantı URL'sinde
#fragmentdeğil?paramolarak mı geçiyor? - Bağımsız denetim: Kriptografi doğrulama için üçüncü taraf güvenlik denetimlerini arayın.
HexaTransfer istemci tarafı AES-256-GCM şifreleme kullanır; anahtar URL fragment'ında kalır ve sunucu yalnızca şifreli blob depolar. hexatransfer.com'da deneyin — ücretsiz, hesap gerekmez, maksimum 10 GB.
Uçtan uca şifreleme ile büyük dosyaları güvenle gönderin
Uçtan uca şifreleme ile 10 GB'a kadar dosya ücretsiz aktarın. Hesap gerekmez. Dosyalarınız yüklenmeden önce tarayıcınızda şifrelenir — başka kimse okuyamaz.
Dosya gönder