Teknik Beyaz Kitaplar

PDF Pro'nun kriptografik mimarisinin, güvenlik modelinin ve gizlilik mühendisliğinin ayrıntılı teknik belgeleri. Güvenlik bilincine sahip kullanıcılar, denetçiler ve inceleyiciler için yazılmıştır.

Yayınlanma: 16 Nisan 2025 Son güncelleme: 16 Nisan 2026 Sürüm: 2.0

Beyaz Kitap Dizini

  1. Uçtan Uca Şifreli Dosya Aktarımı
  2. Gizlilik Önceliklendirilmiş Kriptografik Belge İmzalama

Uçtan Uca Şifreli Dosya Aktarımı

PDF Pro Beyaz Kitabı WP-001 — Mimari ve Güvenlik Analizi

1.1 Özet

Bu beyaz kitap, PDF Pro'nun Güvenli Aktarım sisteminin mimarisini açıklar; dosyaların yüklenmeden önce AES-256-GCM kullanılarak istemci tarafında şifrelendiği bir sıfır bilgi dosya aktarım mekanizmasıdır. Sunucu yalnızca anlaşılmaz şifreli metni saklar ve dosya içeriğini herhangi bir noktada çözme, inceleme veya okuma yeteneğine sahip değildir. Sistem iki anahtar modunu destekler: otomatik oluşturulmuş rastgele anahtar (sunucuya asla gönderilmeyen URL fragmanı aracılığıyla taşınır) veya PBKDF2 kullanılarak parola ifadesinden türetilen anahtar. Her iki modda da şifreleme anahtarı yalnızca gönderenin ve alıcının tarayıcılarında bulunur. Bu belge, kriptografik ilkelleri, veri akışını, tehdit modelini ve sistemin dürüst sınırlamalarını ayrıntılı olarak açıklar.

1.2 Mimari Genel Bakış

Güvenli Aktarım sistemi, tüm kriptografik işlemlerin yalnızca tarayıcıda gerçekleştiği katı bir istemci-sunucu ayrımını takip eder:

Sunucu, şifreli veriler için kasıtlı olarak "aptal bir boru" olacak şekilde tasarlanmıştır. Şifreleme anahtarı, parola ifadesi veya dosya içeriği hakkında hiçbir bilgisi yoktur. Bu, yalnızca politika ile değil, mimari olarak uygulanır.

Tasarım ilkesi: Sunucu, kullanıcı verilerinden ödün vermeden ele geçirilebilir olmalıdır. Tam veritabanı erişimi ve sunucu tarafı kod yürütme ile bile, bir saldırgan aktarılan dosyaların şifresini çözemez.

1.3 Şifreleme: Web Crypto API Aracılığıyla AES-256-GCM

Tüm dosya şifreleme, tarayıcının yerel Web Crypto API'si aracılığıyla erişilen AES-256-GCM kimliği doğrulanmış şifreleme algoritmasını kullanır. Bu, hem gizlilik (verilerin okunamaması) hem de bütünlük (verilerin algılanmadan değiştirilememesi) sağlar.

1.3.1 Algoritma Parametreleri

ParametreDeğerGerekçe
AlgoritmaAES-256-GCMNIST onaylı, ilişkili verilerle kimliği doğrulanmış şifreleme (AEAD)
Anahtar boyutu256 bitMaksimum AES anahtar uzunluğu; kaba kuvvete karşı 128 bit güvenlik sağlar
IV boyutu96 bit (12 bayt)GCM modu için NIST tarafından önerilen IV uzunluğu
Etiket boyutu128 bit (16 bayt)Maksimum bütünlük koruması için tam uzunlukta kimlik doğrulama etiketi
IV oluşturmacrypto.getRandomValues()Kriptografik olarak güvenli rastgele sayı üreteci

1.3.2 Şifreleme Uygulaması

// Basitleştirilmiş şifreleme akışı (Web Crypto API)

const iv = crypto.getRandomValues(new Uint8Array(12));
const salt = crypto.getRandomValues(new Uint8Array(16));

// Anahtarı parola ifadesinden türet (bkz. Bölüm 1.4)
const key = await deriveKey(passphrase, salt);

// Dosyayı şifrele
const ciphertext = await crypto.subtle.encrypt(
  { name: "AES-GCM", iv: iv },
  key,
  fileArrayBuffer
);

// Paket: [salt (16B)] + [iv (12B)] + [şifreli metin + etiket]
const blob = concatenate(salt, iv, ciphertext);

Son şifrelenmiş blob, üç bileşenin birleşiminden oluşur: 16 baytlık salt (anahtar türetme için kullanılır), 12 baytlık IV (AES-GCM için kullanılır) ve eklenmiş 16 baytlık GCM kimlik doğrulama etiketiyle şifreli metin. Bu blob, sunucunun aldığı ve sakladığı verilerdir.

1.4 Anahtar Oluşturma ve Taşıma

Güvenli Aktarım, birbirini dışlayan iki anahtar modunu destekler. Mod, gönderici tarafından aktarım oluşturma sırasında seçilir.

1.4.1 Mod A — Otomatik Oluşturulmuş Anahtar (Varsayılan)

Varsayılan modda parola ifadesi söz konusu değildir. Tarayıcı, doğrudan kriptografik olarak rastgele bir 256 bit AES anahtarı oluşturur:

1.4.2 Mod B — Parola İfadesi Korumalı Aktarım

Gönderici parola ifadesi belirlemeyi seçtiğinde, anahtar bu parola ifadesinden PBKDF2 kullanılarak türetilir:

1.4.3 PBKDF2 Parametreleri (Mod B)

ParametreDeğerGerekçe
AlgoritmaPBKDF2NIST SP 800-132 tarafından önerilir; geniş çapta denetlenmiştir
Hash fonksiyonuSHA-256Standart kriptografik hash; 256 bit çıktı
Yinelemeler600.000PBKDF2-SHA256 için OWASP 2023 önerisini karşılar
Salt boyutu128 bit (16 bayt)Her aktarım için benzersiz; gökkuşağı tablosu saldırılarını önler
Çıktı anahtar uzunluğu256 bitAES-256 anahtar gereksinimiyle eşleşir

1.4.4 Anahtar Türetme Uygulaması (Mod B)

async function deriveKey(passphrase, salt) {
  // Parola ifadesini ham anahtar malzemesi olarak içe aktar
  const keyMaterial = await crypto.subtle.importKey(
    "raw",
    new TextEncoder().encode(passphrase),
    { name: "PBKDF2" },
    false,
    ["deriveKey"]
  );

  // AES-256-GCM anahtarını türet
  return crypto.subtle.deriveKey(
    {
      name: "PBKDF2",
      salt: salt,
      iterations: 600000,
      hash: "SHA-256"
    },
    keyMaterial,
    { name: "AES-GCM", length: 256 },
    false,
    ["encrypt", "decrypt"]
  );
}

Güvenlik notu: Mod B'de güvenlik, parola ifadesi entropisine bağlıdır. Büyük harf, küçük harf, rakam ve sembolleri karıştıran 12+ karakterli parola ifadeleri öneriyoruz.

1.5 Veri Akışı

Güvenli bir aktarımın tam yaşam döngüsü şu yolu izler:

1.5.1 Gönderme (Yükleme) — Mod A (Otomatik Oluşturulmuş Anahtar)

  1. Gönderici, tarayıcıda bir dosya seçer.
  2. Tarayıcı, crypto.getRandomValues() kullanarak rastgele bir 256 bit AES-GCM anahtarı ve rastgele 12 baytlık bir IV oluşturur.
  3. Tarayıcı, AES-256-GCM kullanarak dosyayı şifreler ve şifreli metin + kimlik doğrulama etiketi üretir.
  4. Tarayıcı, [IV | şifreli metin+etiket] bileşenlerini tek bir blob'da birleştirir.
  5. Tarayıcı, şifrelenmiş blob'u HTTPS üzerinden sunucuya yükler.
  6. Sunucu blob'u Supabase Storage'da saklar ve bir meta veri kaydı oluşturur (aktarım kimliği, son kullanma, indirme limiti, dosya adı, dosya boyutu).
  7. Sunucu bir aktarım URL'si döndürür. Tarayıcı, dışa aktarılan anahtarı URL fragmanına (#) ekler.
  8. Gönderici, tam URL'yi (fragman ile) alıcıyla paylaşır.

1.5.2 Gönderme (Yükleme) — Mod B (Parola İfadesi)

  1. Gönderici, tarayıcıda bir dosya seçer ve bir parola ifadesi girer.
  2. Tarayıcı, crypto.getRandomValues() kullanarak rastgele bir 16 baytlık salt ve 12 baytlık IV oluşturur.
  3. Tarayıcı, PBKDF2 (600K yineleme) kullanarak parola ifadesinden bir AES-256 anahtarı türetir.
  4. Tarayıcı, AES-256-GCM kullanarak dosyayı şifreler ve şifreli metin + kimlik doğrulama etiketi üretir.
  5. Tarayıcı, [salt | IV | şifreli metin+etiket] bileşenlerini tek bir blob'da birleştirir.
  6. Tarayıcı, şifrelenmiş blob'u HTTPS üzerinden sunucuya yükler.
  7. Sunucu blob'u Supabase Storage'da saklar ve bir meta veri kaydı oluşturur (aktarım kimliği, son kullanma, indirme limiti, dosya adı, dosya boyutu).
  8. Sunucu, aktarım kimliğini içeren bir aktarım URL'si döndürür.
  9. Gönderici, aktarım URL'sini ve parola ifadesini ayrı kanallar aracılığıyla alıcıyla paylaşır.

1.5.3 Alma (İndirme) — Mod A

  1. Alıcı tam aktarım URL'sini açar (anahtar fragmanda).
  2. Tarayıcı AES anahtarını URL fragmanından çıkarır (sunucuya asla gönderilmez).
  3. Tarayıcı şifrelenmiş blob'u HTTPS üzerinden sunucudan indirir.
  4. Tarayıcı blob'dan IV'yi (ilk 12 bayt) çıkarır.
  5. Tarayıcı, çıkarılan anahtar ve IV ile AES-256-GCM kullanarak şifreli metnin şifresini çözer.
  6. Şifre çözme başarılı olursa (GCM etiketi doğrulanırsa), düz metin dosya kullanıcıya sunulur.
  7. Sunucu indirme sayacını günceller ve okunduğunda-yok-et etkinse blob'u siler.

1.5.4 Alma (İndirme) — Mod B

  1. Alıcı aktarım URL'sini açar ve tarayıcıda parola ifadesini girer.
  2. Tarayıcı şifrelenmiş blob'u HTTPS üzerinden sunucudan indirir.
  3. Tarayıcı, blob'dan salt'ı (ilk 16 bayt) ve IV'yi (sonraki 12 bayt) çıkarır.
  4. Tarayıcı, PBKDF2 (600K yineleme) kullanarak parola ifadesi + salt'tan AES-256 anahtarını türetir.
  5. Tarayıcı, türetilen anahtar ve IV ile AES-256-GCM kullanarak şifreli metnin şifresini çözer.
  6. Şifre çözme başarılı olursa (GCM etiketi doğrulanırsa), düz metin dosya kullanıcıya sunulur.
  7. Şifre çözme başarısız olursa (yanlış parola ifadesi = yanlış anahtar = geçersiz GCM etiketi), bir hata gösterilir.
  8. Sunucu indirme sayacını günceller ve okunduğunda-yok-et etkinse blob'u siler.

1.6 Sunucunun Sakladıkları ve Asla Görmediği Veriler

Veri ÖğesiSunucu Erişimi?Ayrıntılar
Şifreli blob (salt + IV + şifreli metin + etiket)EvetAnlaşılmaz ikili veri; sunucu içerikleri yorumlayamaz
Aktarım kimliğiEvetAktarım tanımlayıcıları, PostgreSQL'in gen_random_uuid() tarafından oluşturulan UUID v4 değerleridir ve sunucunun CSPRNG'sinden 122 bitlik kriptografik rastgelelik sağlar
Orijinal dosya adıEvetAlıcıya gösterilmek üzere meta verilerde saklanır
Orijinal dosya boyutuEvetGörüntüleme amacıyla meta verilerde saklanır
Son kullanma zaman damgasıEvetOtomatik silme uygulaması için kullanılır
İndirme sayısı / limitiEvetOkunduğunda-yok-et ve indirme limiti uygulaması için kullanılır
Gönderici kullanıcı kimliği (kimliği doğrulanmışsa)EvetYönetim için aktarımı hesaba bağlar
Parola ifadesiHayır — aslaSunucuya asla gönderilmez; tarayıcıdan asla ayrılmaz
Türetilen şifreleme anahtarıHayır — aslaYalnızca şifreleme/şifre çözme sırasında tarayıcı belleğinde bulunur
Düz metin dosya içeriğiHayır — aslaSunucuya yalnızca şifrelenmiş şifreli metin ulaşır
PBKDF2 yineleme sayısıHayırİstemcide sabit kodlanmıştır; sunucuya iletilmez

1.7 Otomatik Son Kullanma ve Okunduğunda Yok Et

Tüm güvenli aktarımlar tasarım gereği geçicidir. Kalıcı depolama seçeneği yoktur.

1.7.1 Son Kullanma Seçenekleri

SeçenekDavranışUygulama
Okunduğunda yok etŞifreli blob, ilk başarılı indirmeden hemen sonra silinirSunucu tarafı: indirme akışı tamamlandıktan sonra blob depolamadan silinir
1 saatİndirme durumuna bakılmaksızın 1 saat sonra otomatik silinirSunucu tarafı: zamanlanmış temizleme görevi + erişimde son kullanma denetimi
24 saat24 saat sonra otomatik silinirYukarıdaki ile aynı
7 günMaksimum saklama; 7 gün sonra otomatik silinirYukarıdaki ile aynı

1.7.2 Silme Garantisi

Bir aktarımın süresi dolduğunda veya okunduğunda yok edildiğinde, şifrelenmiş blob Supabase Storage'dan kalıcı olarak silinir. Meta veri kaydı, kalıcı olarak temizlenmeden önce 30 gün boyunca yumuşak silinmiş bir durumda (suistimal araştırması için) saklanır. Meta veri kaydı; şifreleme anahtarı, parola ifadesi veya dosyayı yeniden oluşturmak için kullanılabilecek herhangi bir bilgi içermez.

1.8 Tehdit Modeli ve Hafifletmeler

TehditSaldırı VektörüHafifletme
Sunucu ele geçirme Saldırgan veritabanına ve depolamaya tam erişim kazanır Tüm saklanan veriler AES-256-GCM şifreli metnidir. Saldırgan yalnızca anlaşılmaz blob'lar elde eder. Parola ifadesi olmadan 256 bit AES'i kaba kuvvetle kırmak hesaplama açısından imkansızdır.
Ağ dinleme (MITM) Saldırgan iletim sırasındaki verileri yakalar Tüm trafik TLS 1.3 kullanır. TLS kırılsa bile saldırgan yalnızca şifreli blob'lar elde eder (sunucu ele geçirme ile aynı).
Zayıf parola ifadesi Saldırgan kısa veya yaygın bir parola ifadesini kaba kuvvetle kırar 600K yineleme ile PBKDF2, her tahmini hesaplama açısından pahalı hale getirir. 4 karakterlik bir parola ifadesi bile önemli ölçüde hesaplama gerektirir. Arayüz, minimum parola ifadesi uzunluğunu zorunlu kılar ve güç geri bildirimi sağlar.
Parola ifadesi dinleme Saldırgan gönderici ile alıcı arasında paylaşılan parola ifadesini yakalar Parola ifadesi bant dışı (sistemimiz aracılığıyla değil) paylaşılır. Aktarım URL'sinden farklı bir kanal aracılığıyla paylaşılmasını öneriyoruz. Bu bir kullanıcı sorumluluğudur.
İstemci tarafı kod oynama Saldırgan kullanıcıya sunulan JavaScript'i değiştirir Tüm varlıklar HTTPS üzerinden Vercel'in CDN'si ile sunulur. Subresource Integrity (SRI) hash'leri CDN düzeyindeki oynamalara karşı koruma sağlar. Kullanıcılar kaynak kodunu tarayıcı Geliştirici Araçlarında doğrulayabilir.
Bellek çıkarma Saldırgan şifreleme anahtarını tarayıcı belleğinden çıkarır Web Crypto API anahtarları mümkün olduğunda çıkarılamaz olarak işaretlenir. Türetilen anahtarlar yalnızca şifreleme/şifre çözme işlemi sırasında bellekte bulunur. Tarayıcı bellek izolasyonu işletim sistemi düzeyinde koruma sağlar.
Tekrar saldırısı Saldırgan yakalanan şifrelenmiş bir blob'u yeniden oynatır Her aktarımın benzersiz bir kimliği vardır ve indirme limitleri ve son kullanma ile korunur. Okunduğunda yok et aktarımları ilk erişimden sonra silinir.

1.8.1 Varsayımlar

1.8.2 Kapsam Dışı

1.9 Sınırlamalar ve Dürüst Açıklama

Dürüst sınırlamalar: Hiçbir güvenlik sistemi mükemmel değildir. Bilinen sınırlamaların şeffaf bir şekilde açıklanmasına inanıyoruz.


Gizlilik Önceliklendirilmiş Kriptografik Belge İmzalama

PDF Pro Beyaz Kitabı WP-002 — Mimari ve Güvenlik Analizi

2.1 Özet

Bu beyaz kitap, PDF Pro'nun Gizlilik İmzası sisteminin mimarisini açıklar; PDF belgesinin imzalayanın tarayıcısından asla ayrılmadığı kriptografik bir belge imzalama mekanizmasıdır. Sistem, ayrık dijital imzalar üretmek için P-256 eğrisi ile ECDSA ve SHA-256 hash'leme kullanır. Sunucuya yalnızca belge hash'i, kriptografik imza ve açık anahtar iletilir. Özel anahtarlar; PBKDF2 anahtar türetme (600.000 yineleme) ve AES-256-GCM şifrelemesi ile korunarak IndexedDB kullanılarak yalnızca kullanıcının tarayıcısında oluşturulur, şifrelenir ve saklanır. Bu belge, eksiksiz imzalama ve doğrulama mimarisini, anahtar yönetim modelini, imzalanmış yük şemasını, denetim izi tasarımını, tehdit modelini ve dürüst sınırlamaları ayrıntılı olarak açıklar.

2.2 Mimari Genel Bakış

Gizlilik İmzası sistemi temel bir kısıtlama etrafında tasarlanmıştır: PDF belgesi sunucuya asla iletilmemelidir. Bu, ayrık imza modeli aracılığıyla mimari olarak uygulanır.

Temel garanti: Sunucu, PDF belgesini asla görmez, almaz veya işlemez. Sunucunun aldığı tek belgeyle ilgili veri, SHA-256 hash'idir — orijinal belgenin yeniden oluşturulamayacağı, sabit boyutlu 256 bitlik bir değerdir.

2.3 İmzalama Algoritması: ECDSA P-256 / SHA-256

2.3.1 Algoritma Parametreleri

ParametreDeğerGerekçe
İmza algoritmasıECDSA (Eliptik Eğri Dijital İmza Algoritması)NIST FIPS 186-4; kompakt imzalar; anahtar bit başına güçlü güvenlik
EğriP-256 (secp256r1 / prime256v1)NIST onaylı; 128 bit güvenlik seviyesi; geniş Web Crypto API desteği
Hash fonksiyonuSHA-256NIST FIPS 180-4; 256 bit özet; çarpışma dirençli
Anahtar boyutu256 bit özel anahtar, 512 bit açık anahtar (sıkıştırılmamış)P-256 için standart; ~3072 bit RSA'ya eşdeğer
İmza boyutu64 bayt (r: 32 bayt, s: 32 bayt)Kompakt; depolama ve iletim için uygun
İmza formatıIEEE P1363 (ham r || s)Yerel Web Crypto API çıktısı; depolama için base64url ile kodlanmıştır

İmza kodlaması: Web Crypto API'nin P-256 ile ECDSA'sı, big-endian sabit genişlikli formatta iki 32 baytlık tamsayıdan (r || s) oluşan 64 baytlık ham bir imza üretir. Bu ham çıktı, depolama için base64url ile kodlanır. Bu DER kodlu DEĞİLDİR — Web Crypto API'nin yerel olarak ürettiği IEEE P1363 formatıdır.

2.3.2 İmzalama Akışı

// 1. PDF belgesini hash'le (istemci tarafı)
const fileBuffer = await file.arrayBuffer();
const hashBuffer = await crypto.subtle.digest("SHA-256", fileBuffer);
const hashHex = Array.from(new Uint8Array(hashBuffer))
  .map(b => b.toString(16).padStart(2, '0')).join('');

// 2. Hash'i özel anahtarla imzala (istemci tarafı)
const signature = await crypto.subtle.sign(
  { name: "ECDSA", hash: "SHA-256" },
  privateKey,   // IndexedDB'den CryptoKey (şifresi çözülmüş)
  hashBuffer
);

// 3. Sunucuya gönder: hash + imza + açık anahtar (PDF DEĞİL)
await submitSignature({
  documentHash: hashHex,
  signature: base64Encode(signature),
  publicKey: exportedPublicKeyJWK
});

2.4 Anahtar Yönetimi: Geçici ve Kalıcı

Anahtar TürüBağlamYaşam DöngüsüDepolama
Geçici Misafir kullanıcılar (oturum açmamış) Oturum başına oluşturulur; sekme kapandığında yok edilir Yalnızca bellekte (CryptoKey nesnesi); asla kalıcılaştırılmaz
Kalıcı Kimliği doğrulanmış kullanıcılar (oturum açmış) Bir kez oluşturulur; oturumlar arasında kalıcılaştırılır; iptal edilebilir IndexedDB (PBKDF2 + AES-256-GCM ile şifrelenmiş)

2.4.1 Anahtar Oluşturma

// ECDSA P-256 anahtar çifti oluştur (Web Crypto API)
const keyPair = await crypto.subtle.generateKey(
  {
    name: "ECDSA",
    namedCurve: "P-256"
  },
  true,   // çıkarılabilir (şifreleme + depolama için gerekli)
  ["sign", "verify"]
);

// Sunucu kaydı için açık anahtarı JWK olarak dışa aktar
const publicKeyJWK = await crypto.subtle.exportKey("jwk", keyPair.publicKey);

// Şifrelenmiş depolama için özel anahtarı JWK olarak dışa aktar
const privateKeyJWK = await crypto.subtle.exportKey("jwk", keyPair.privateKey);

Açık anahtar formatı: Açık anahtarlar JWK (JSON Web Key) formatında dışa aktarılır ve saklanır. Anahtar parmak izi; yalnızca açık alanları {crv, kty, x, y} alfabetik olarak sıralanmış anahtarlarla içeren kanonik JWK'nın SHA-256'sı olarak hesaplanır.

2.5 Özel Anahtar Koruması: PBKDF2 + AES-GCM → IndexedDB

Kalıcı özel anahtarlar asla düz metin olarak saklanmaz. IndexedDB'ye yazılmadan önce özel anahtar (JWK JSON olarak dışa aktarılmış), Güvenli Aktarım ile aynı model kullanılarak şifrelenir:

2.5.1 Koruma Parametreleri

ParametreDeğer
Anahtar türetmePBKDF2-SHA256, 600.000 yineleme
SaltRastgele 16 bayt (anahtar başına)
ŞifrelemeAES-256-GCM
IVRastgele 12 bayt (şifreleme başına)
GirdiÖzel anahtar JWK (UTF-8 kodlu JSON dizesi)
IndexedDB'de saklanan çıktı{ salt, iv, ciphertext, publicKeyJWK, keyId, createdAt }

2.5.2 Depolama Şeması

// Şifrelenmiş bir imzalama anahtarı için IndexedDB kayıt yapısı
{
  "keyId":       "uuid-v4-unique-identifier",
  "publicKey":   { /* JWK formatı, şifrelenmemiş */ },
  "encryptedPrivateKey": {
    "salt":       "base64-encoded-16-bytes",
    "iv":         "base64-encoded-12-bytes",
    "ciphertext": "base64-encoded-aes-gcm-ciphertext"
  },
  "algorithm":   "ECDSA",
  "curve":       "P-256",
  "createdAt":   "2026-04-16T00:00:00.000Z",
  "userId":      "supabase-auth-user-id"
}

Anahtar kurtarma: Kullanıcı imzalama parola ifadesini unutursa, özel anahtar kurtarılamaz. Parola ifadesine, türetilen anahtara veya PBKDF2 + AES-GCM korumasını atlamak için herhangi bir mekanizmaya sahip değiliz. Kullanıcılar anahtar yedeklerini dışa aktarmalıdır.

2.6 Ayrık İmza Modeli

PDF Pro, ayrık imza modeli kullanır; bu, imzanın belgeden ayrı olarak saklandığı anlamına gelir. Bu kritik gizlilik mekanizmasıdır: belge imzalayanın cihazından asla ayrılmaz.

2.6.1 Sunucuya Gönderilenler

2.6.2 Sunucuya Gönderilmeyenler

Kriptografik güvence: SHA-256 tek yönlü bir hash fonksiyonudur. Yalnızca e3b0c44298fc1c14... hash'i verildiğinde, ECDSA ve SHA-256'nın güvenlik varsayımları altında, orijinal belgenin yeniden oluşturulamayacağına dair güçlü kriptografik güvence sağlar. Hash, yeniden hash'lendiğinde kimliği doğrulamanın ötesinde belgenin içerikleri, uzunluğu veya yapısı hakkında hiçbir şey açığa çıkarmaz.

2.7 İmzalanmış Yük Şeması v1.0

Aşağıdaki JSON şeması, sunucuda saklanan eksiksiz imza kaydını tanımlar:

{
  "schemaVersion":  "1.0",
  "signatureId":    "uuid-v4",
  "documentHash":   "sha256-hex-64-chars",
  "hashAlgorithm":  "SHA-256",
  "signature":      "base64-encoded-ecdsa-signature",
  "signatureAlgorithm": "ECDSA",
  "curve":          "P-256",
  "publicKey": {
    "kty": "EC",
    "crv": "P-256",
    "x":   "base64url-encoded-x-coordinate",
    "y":   "base64url-encoded-y-coordinate"
  },
  "signer": {
    "identityLevel": "authenticated | self-asserted",
    "displayName":   "string or null",
    "email":         "string or null",
    "userId":        "supabase-uid or null"
  },
  "timestamp":      "ISO-8601-UTC",
  "metadata": {
    "fileName":     "original-file-name.pdf",
    "fileSize":     123456,
    "pageCount":    12,
    "clientVersion": "2.0.0",
    "userAgent":    "browser-user-agent-string"
  },
  "auditChain": {
    "previousEventHash": "sha256-of-previous-audit-event or null",
    "eventHash":         "sha256-of-this-record"
  }
}

2.8 Doğrulama Akışı

İmza doğrulama iki aşamalı bir süreçtir: istemci tarafı kriptografik doğrulama ve ardından sunucu tarafı çapraz kontrol.

2.8.1 1. Aşama: İstemci Tarafı Kriptografik Doğrulama

  1. Kullanıcı tarayıcıya bir PDF yükler.
  2. Tarayıcı yüklenen PDF'nin SHA-256 hash'ini hesaplar.
  3. Tarayıcı, bu hash ile eşleşen imza kayıtlarını sunucuya sorar.
  4. Döndürülen her imza kaydı için tarayıcı ECDSA doğrulaması gerçekleştirir:
    const isValid = await crypto.subtle.verify(
      { name: "ECDSA", hash: "SHA-256" },
      importedPublicKey,
      signatureBuffer,
      hashBuffer
    );
  5. isValid === true ise imza kriptografik olarak geçerlidir: belge imzalamadan bu yana değiştirilmemiştir ve imza, ilgili özel anahtarın sahibi tarafından üretilmiştir.

2.8.2 2. Aşama: Sunucu Tarafı Çapraz Kontrol

  1. Sunucu, imza kaydındaki açık anahtarın bilinen bir kullanıcıya kayıtlı olduğunu doğrular (kimliği doğrulanmış imzalar için).
  2. Sunucu, imza kaydının iptal edilmediğini doğrular.
  3. Sunucu, denetim izi bütünlüğünü doğrular (hash zinciri doğrulaması).
  4. Sunucu, imzalayanın kimlik seviyesini ve kayıt durumunu döndürür.

2.8.3 Doğrulama Sonuçları

SonuçAnlamı
Geçerli (Kimliği Doğrulanmış)İmza kriptografik olarak geçerlidir VE açık anahtar, kayıtlı, kimliği doğrulanmış bir PDF Pro kullanıcısına aittir.
Geçerli (Kendi Beyanı)İmza kriptografik olarak geçerlidir ancak imzalayanın kimliği kendi beyanıdır (misafir kullanıcı veya doğrulanmamış ad).
GeçersizKriptografik doğrulama başarısız oldu. Belge imzalamadan bu yana değiştirilmiş veya imza bozulmuş.
İptal edildiİmza geçerliydi ancak imzalayan tarafından açıkça iptal edildi.
İmza bulunamadıBu belge hash'i için imza kaydı mevcut değil.

2.9 Denetim İzi: Hash Zincirli Olaylar

Her imzalama ve doğrulama olayı, oynanması tespit edilebilir bir denetim izinde kaydedilir. Olaylar hash ile zincirlenir: her olay, bir önceki olayın SHA-256 hash'ini içerir ve blok zincirine benzer yalnızca ekleme yapılan bir zincir oluşturur.

2.9.1 Denetim Olay Türleri

Olay TürüTetikleyiciKaydedilen Veri
KEY_REGISTEREDKullanıcı yeni bir açık anahtar kaydederAçık anahtar JWK, kullanıcı kimliği, zaman damgası
DOCUMENT_SIGNEDKullanıcı bir belge imzalarBelge hash'i, imza, açık anahtar, imzalayan kimliği, zaman damgası
SIGNATURE_VERIFIEDHerhangi bir kullanıcı bir imzayı doğrularBelge hash'i, doğrulama sonucu, doğrulayan bilgileri (kimliği doğrulanmışsa), zaman damgası
SIGNATURE_REVOKEDİmzalayan bir imzayı iptal ederİmza kimliği, iptal nedeni, zaman damgası
KEY_REVOKEDKullanıcı bir açık anahtarı iptal ederAçık anahtar kimliği, iptal nedeni, zaman damgası

2.9.2 Hash Zinciri Yapısı

// Her denetim olayı şunları içerir:
{
  "eventId":            "uuid-v4",
  "eventType":          "DOCUMENT_SIGNED",
  "timestamp":          "ISO-8601-UTC",
  "data":               { /* olaya özgü yük */ },
  "previousEventHash": "sha256-of-previous-event-json",
  "eventHash":          "sha256-of-this-event-json-without-eventHash"
}

// Oynama tespiti: zinciri doğrulamak için hesaplayın:
// SHA-256(JSON.stringify(eventHash alanı olmadan olay))
// ve eventHash ile eşleştiğini onaylayın.
// Ardından previousEventHash'in önceki olayın eventHash'i ile eşleştiğini onaylayın.

Zincirdeki herhangi bir olay değiştirilirse, sonraki tüm hash bağlantıları kopar ve bu da oynamanın anında tespit edilmesini sağlar. Bu, denetim izi bütünlüğüne güçlü bir garanti sağlar.

Önemli Sınırlama: Hash zinciri, kaydedilen olay sırası içindeki oynamayı tespit edilebilir kılar. Ancak doğrudan erişime sahip bir veritabanı yöneticisi teorik olarak zinciri silip yeniden oluşturabilir. Daha güçlü garantiler, bu sürümde uygulanmayan harici zaman damgalama veya üçüncü taraf tasdiki gerektirir.

2.10 Kimlik Seviyeleri

SeviyeGereksinimlerGüven ÖzellikleriKullanım Durumu
Kimliği Doğrulanmış Doğrulanmış e-postası olan oturum açmış PDF Pro kullanıcısı; hesaba kayıtlı kalıcı anahtar çifti E-posta Supabase Auth tarafından doğrulanmış; açık anahtar kimliği doğrulanmış hesaba bağlı; denetim izi kullanıcı kimliğine bağlı İş belgeleri, sözleşmeler, resmi anlaşmalar
Kendi Beyanı Misafir kullanıcı veya kendi girdiği adı olan kimliği doğrulanmış kullanıcı; geçici veya kalıcı anahtar çifti Kriptografik bütünlük garanti edilir; imzalayan kimliği kendi beyanıdır ve bağımsız olarak doğrulanmaz Hızlı imzalama, kişisel belgeler, gayri resmi anlaşmalar

Not: Ürün arayüzünde 'self_asserted', 'Kendi Beyanı Kimliği' veya 'Misafir İmzalama' olarak görüntülenebilir. 'authenticated', 'Kimliği Doğrulanmış Hesap' olarak görüntülenebilir. Bunlar, aynı temel kimlik seviyeleri için görüntüleme etiketleridir.

Kimlik bağlama: "Kimliği doğrulanmış" bir imza, açık anahtarın doğrulanmış e-postası olan bir PDF Pro hesabına kayıtlı olduğu anlamına gelir. İmzalayanın gerçek dünyadaki kimliğinin devlet kimliği, biyometri veya şahsen doğrulama yoluyla doğrulandığı anlamına GELMEZ. Müşterini Tanı (KYC) kontrolleri yapmıyoruz.

2.11 Tehdit Modeli

TehditSaldırı VektörüHafifletme
Tekrar saldırısı Saldırgan geçerli bir imzayı kopyalayıp farklı bir belgeye uygular İmza, belirli belgenin SHA-256 hash'ine bağlıdır. Farklı bir belgenin farklı bir hash'i olur ve ECDSA doğrulaması başarısız olur.
Sahtecilik Saldırgan özel anahtar olmadan geçerli bir imza oluşturur ECDSA P-256 güvenliği Eliptik Eğri Ayrık Logaritma Problemi'ne (ECDLP) dayanır. Özel anahtar olmadan imza sahtelemek hesaplama açısından imkansızdır (128 bit güvenlik seviyesi).
Anahtar değiştirme Saldırgan kendi açık anahtarını kaydeder ve bir imzanın başkası tarafından yapıldığını iddia eder Kimliği doğrulanmış imzalar, açık anahtarı doğrulanmış bir e-postaya bağlar. Denetim izi hangi anahtarın hangi belgeyi imzaladığını kaydeder. Anahtar kayıt olayları hash ile zincirlenir.
Belge değiştirme Saldırgan imzalı bir PDF'yi değiştirir ve imzanın hâlâ geçerli olduğunu iddia eder PDF'deki herhangi bir değişiklik onun SHA-256 hash'ini değiştirir. Mevcut imza yeni hash'e karşı doğrulamada başarısız olur. Çarpışma bulmak (aynı hash'e sahip farklı belge) ~2^128 işlem gerektirir.
Özel anahtar hırsızlığı Saldırgan şifrelenmiş özel anahtarı IndexedDB'den çıkarır Özel anahtar, PBKDF2 (600K yineleme) ile anahtarlandırılmış AES-256-GCM ile şifrelenmiştir. Parola ifadesi olmadan anahtarın şifresini çözmek hesaplama açısından imkansızdır.
Sunucu ele geçirme Saldırgan tam sunucu erişimi kazanır Sunucuda yalnızca açık anahtarlar ve imza kayıtları vardır. Özel anahtarlar sunucuya asla ulaşmaz. Bir saldırgan yeni imzaları sahteleyemez. Mevcut kayıtları silebilir veya değiştirebilir ancak hash zinciri kopmaları tespit edilebilir olur.
Denetim izi oynaması Saldırgan sunucudaki denetim izi olaylarını değiştirir Hash zincirli olaylar: herhangi bir olayın değiştirilmesi o noktadan itibaren zinciri bozar. Bağımsız doğrulama araçları zincir kopmalarını tespit edebilir.

2.11.1 Varsayımlar

2.11.2 Kapsam Dışı

2.12 Dürüst Açıklama

PDF Pro imzalarının NE OLMADIĞI:

2.12.1 PDF Pro İmzalarının Uygun Olduğu Durumlar

Taahhüdümüz: Güvenliği pazarlama ile değil, mimari ile inşa ediyoruz. Bu beyaz kitaplar, sistemlerimizin sınırlamaları dahil olmak üzere tam olarak nasıl çalıştığını açıklar. Güvenlik bilincine sahip kullanıcıların eksiksiz teknik şeffaflığı hak ettiğine inanıyoruz. Mimarimizin herhangi bir yönü hakkında sorularınız varsa, info@webdesign9.com adresinden bizimle iletişime geçin.