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.
Uçtan Uca Şifreli Dosya Aktarımı
PDF Pro Beyaz Kitabı WP-001 — Mimari ve Güvenlik Analizi
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.
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.
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.
| Parametre | Değer | Gerekçe |
|---|---|---|
| Algoritma | AES-256-GCM | NIST onaylı, ilişkili verilerle kimliği doğrulanmış şifreleme (AEAD) |
| Anahtar boyutu | 256 bit | Maksimum AES anahtar uzunluğu; kaba kuvvete karşı 128 bit güvenlik sağlar |
| IV boyutu | 96 bit (12 bayt) | GCM modu için NIST tarafından önerilen IV uzunluğu |
| Etiket boyutu | 128 bit (16 bayt) | Maksimum bütünlük koruması için tam uzunlukta kimlik doğrulama etiketi |
| IV oluşturma | crypto.getRandomValues() | Kriptografik olarak güvenli rastgele sayı üreteci |
// 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.
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.
Varsayılan modda parola ifadesi söz konusu değildir. Tarayıcı, doğrudan kriptografik olarak rastgele bir 256 bit AES anahtarı oluşturur:
crypto.getRandomValues() ve crypto.subtle.generateKey() aracılığıyla rastgele bir 256 bit AES-GCM anahtarı oluşturur.#) yerleştirilir.Gönderici parola ifadesi belirlemeyi seçtiğinde, anahtar bu parola ifadesinden PBKDF2 kullanılarak türetilir:
| Parametre | Değer | Gerekçe |
|---|---|---|
| Algoritma | PBKDF2 | NIST SP 800-132 tarafından önerilir; geniş çapta denetlenmiştir |
| Hash fonksiyonu | SHA-256 | Standart kriptografik hash; 256 bit çıktı |
| Yinelemeler | 600.000 | PBKDF2-SHA256 için OWASP 2023 önerisini karşılar |
| Salt boyutu | 128 bit (16 bayt) | Her aktarım için benzersiz; gökkuşağı tablosu saldırılarını önler |
| Çıktı anahtar uzunluğu | 256 bit | AES-256 anahtar gereksinimiyle eşleşir |
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.
Güvenli bir aktarımın tam yaşam döngüsü şu yolu izler:
crypto.getRandomValues() kullanarak rastgele bir 256 bit AES-GCM anahtarı ve rastgele 12 baytlık bir IV oluşturur.#) ekler.crypto.getRandomValues() kullanarak rastgele bir 16 baytlık salt ve 12 baytlık IV oluşturur.| Veri Öğesi | Sunucu Erişimi? | Ayrıntılar |
|---|---|---|
| Şifreli blob (salt + IV + şifreli metin + etiket) | Evet | Anlaşılmaz ikili veri; sunucu içerikleri yorumlayamaz |
| Aktarım kimliği | Evet | Aktarı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ı | Evet | Alıcıya gösterilmek üzere meta verilerde saklanır |
| Orijinal dosya boyutu | Evet | Görüntüleme amacıyla meta verilerde saklanır |
| Son kullanma zaman damgası | Evet | Otomatik silme uygulaması için kullanılır |
| İndirme sayısı / limiti | Evet | Okunduğunda-yok-et ve indirme limiti uygulaması için kullanılır |
| Gönderici kullanıcı kimliği (kimliği doğrulanmışsa) | Evet | Yönetim için aktarımı hesaba bağlar |
| Parola ifadesi | Hayır — asla | Sunucuya asla gönderilmez; tarayıcıdan asla ayrılmaz |
| Türetilen şifreleme anahtarı | Hayır — asla | Yalnızca şifreleme/şifre çözme sırasında tarayıcı belleğinde bulunur |
| Düz metin dosya içeriği | Hayır — asla | Sunucuya yalnızca şifrelenmiş şifreli metin ulaşır |
| PBKDF2 yineleme sayısı | Hayır | İstemcide sabit kodlanmıştır; sunucuya iletilmez |
Tüm güvenli aktarımlar tasarım gereği geçicidir. Kalıcı depolama seçeneği yoktur.
| Seçenek | Davranış | Uygulama |
|---|---|---|
| Okunduğunda yok et | Şifreli blob, ilk başarılı indirmeden hemen sonra silinir | Sunucu tarafı: indirme akışı tamamlandıktan sonra blob depolamadan silinir |
| 1 saat | İndirme durumuna bakılmaksızın 1 saat sonra otomatik silinir | Sunucu tarafı: zamanlanmış temizleme görevi + erişimde son kullanma denetimi |
| 24 saat | 24 saat sonra otomatik silinir | Yukarıdaki ile aynı |
| 7 gün | Maksimum saklama; 7 gün sonra otomatik silinir | Yukarıdaki ile aynı |
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.
| Tehdit | Saldı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. |
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
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.
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.
| Parametre | Değer | Gerekç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ğri | P-256 (secp256r1 / prime256v1) | NIST onaylı; 128 bit güvenlik seviyesi; geniş Web Crypto API desteği |
| Hash fonksiyonu | SHA-256 | NIST FIPS 180-4; 256 bit özet; çarpışma dirençli |
| Anahtar boyutu | 256 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 boyutu | 64 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.
// 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 });
| Anahtar Türü | Bağlam | Yaş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ş) |
// 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.
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:
| Parametre | Değer |
|---|---|
| Anahtar türetme | PBKDF2-SHA256, 600.000 yineleme |
| Salt | Rastgele 16 bayt (anahtar başına) |
| Şifreleme | AES-256-GCM |
| IV | Rastgele 12 bayt (şifreleme başına) |
| Girdi | Özel anahtar JWK (UTF-8 kodlu JSON dizesi) |
| IndexedDB'de saklanan çıktı | { salt, iv, ciphertext, publicKeyJWK, keyId, createdAt } |
// Ş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.
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.
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.
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"
}
}İmza doğrulama iki aşamalı bir süreçtir: istemci tarafı kriptografik doğrulama ve ardından sunucu tarafı çapraz kontrol.
const isValid = await crypto.subtle.verify( { name: "ECDSA", hash: "SHA-256" }, importedPublicKey, signatureBuffer, hashBuffer );
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.| 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çersiz | Kriptografik 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. |
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.
| Olay Türü | Tetikleyici | Kaydedilen Veri |
|---|---|---|
KEY_REGISTERED | Kullanıcı yeni bir açık anahtar kaydeder | Açık anahtar JWK, kullanıcı kimliği, zaman damgası |
DOCUMENT_SIGNED | Kullanıcı bir belge imzalar | Belge hash'i, imza, açık anahtar, imzalayan kimliği, zaman damgası |
SIGNATURE_VERIFIED | Herhangi bir kullanıcı bir imzayı doğrular | Belge 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_REVOKED | Kullanıcı bir açık anahtarı iptal eder | Açık anahtar kimliği, iptal nedeni, zaman damgası |
// 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.
| Seviye | Gereksinimler | Güven Özellikleri | Kullanı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.
| Tehdit | Saldı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. |
PDF Pro imzalarının NE OLMADIĞI:
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.