FORENSICCONSENT • LISANSZINCIR

Adli kanıt seviyesinde
muvafakat ve lisans yönetimi

Hibrit on-chain / off-chain mimari ile imzalı kayıtları kriptografik olarak doğrulanabilir, hukuken savunulabilir, matematiksel olarak değiştirilemez kılar.

Domain · lisanszincir.com Stack · FastAPI + Nginx + Sepolia EVM TLS · A+ (96/100) Mozilla Observatory · A+ (110/100, 10/10) ● Production live
Problem

Klasik onam ve lisans kayıtları
üç yerden sızıyor

🖋️

Islak imza kaybolur

Kağıt formlar yıpranır, kaybolur, kopyalanır. "Aslı" hangisi olduğunu kimse ispatlayamaz.

🗃️

Dijital kayıt değiştirilir

PDF, veritabanı, dosya sunucusu — admin yetkisi olan herkes geçmişi yeniden yazabilir.

📜

Audit trail temizlenir

Log dosyaları silinir, rotated edilir, kapatılır. Tartışmada elinizde kanıt kalmaz.

Çözüm

Her kayıt;
imzalı · zaman damgalı · şifreli · çıpalanmış

Belge → SHA-256 → Ed25519 imzası → TSA timestamp → AES-256-GCM şifreleme → Sepolia blokzincirine çıpa → Hash-zincirli audit log. Tek bir bit değişirse tüm zincir kırılır.

Uyumluluk
🇹🇷KVKK
🇪🇺GDPR
📜eIDAS
🔐ETSI
Yüksek seviye mimari

Dört katman, sıkı görev ayrımı

🌐
Browser
Dashboard SPA
🛡️
Nginx
TLS · Rate limit · CSP
FastAPI Backend
Python · Async
⛓️ Sepolia EVM
ConsentRegistry.sol — yalnızca hash'ler on-chain
🔒 /data/storage/
Belgeler AES-256-GCM şifreli, off-chain
📜 /data/audit/audit.jsonl
Hash-zincirli append-only log

Backend port internet'e kapalı — tüm trafik yalnızca nginx üzerinden, TLS terminate edildikten sonra.

Custody zinciri

Bir kayıt sekiz adımdan geçer

Her adım bağımsız doğrulanabilir. Adımları ilerletmek için tuşuna bas.

1
Pseudonymize
TC + salt → SHA-256
ham TC asla saklanmaz
2
Canonicalize
JSON → RFC-8785
deterministik form
3
Hash
SHA-256
contentHash
4
Sign
Ed25519
kanıtlanabilir kaynaklı
5
Timestamp
TSA imzası
"ne zaman" sabitlenir
6
Encrypt
AES-256-GCM
off-chain depolama
7
Anchor
Sepolia
ConsentRegistry.sol
8
Audit
jsonl
her satır → önceki hash
Her adım önceki adımın çıktısı üzerinde işler. Tek bir bit değişikliği bütün zinciri matematiksel olarak geçersiz kılar.
Production deployment

Üç container, tek host, sıfır manuel müdahale

forensic_nginx
nginx:1.25-alpine
Port80, 443
Restartunless-stopped
TLS terminate · rate limit · security headers · static dashboard · reverse proxy
forensic_backend
infra-backend (custom)
Portexpose: 8000
Healthcheck/health
FastAPI · web3.py · cryptography · async I/O · Sepolia client
forensic_certbot
certbot/certbot:latest
Cycle12 saat
Renew−30 gün
Let's Encrypt cert auto-renew · ACME webroot challenge
Domainlisanszincir.com
HostAWS EC2 Ubuntu
Kernel6.17.0-1012-aws
Cert validJul 23 2026'a kadar
Backend modülleri

Görev ayrımı kemiklerine kadar işlenmiş

backend/app/ ├─ main.py // FastAPI bootstrap, lifespan, /health ├─ config.py // Pydantic Settings (env'den) ├─ dependencies.py // DI: chain client, services │ ├─ routers/ // HTTP yüzeyi │ ├─ consents.py │ ├─ verify.py │ ├─ evidence.py │ └─ lisans.py // dashboard'un kullandığı │ ├─ services/ // İş mantığı (router'dan ayrı) │ ├─ consent_service.py │ ├─ verify_service.py │ ├─ evidence_service.py │ └─ lisans_service.py
├─ core/ // Düşük seviye kripto │ ├─ crypto.py // Ed25519, pseudonymize, hash │ ├─ chain.py // web3.py + dry-run + send │ ├─ storage.py // AES-256-GCM I/O │ ├─ tsa.py // TSA token üret/doğrula │ └─ audit.py // hash-chained jsonl │ └─ models/ // Pydantic şemalar ├─ consent.py ├─ evidence.py └─ lisans.py Test coverage : pytest + tests/ Container start: docker-entrypoint.sh Reqs : requirements.txt

Router → Service → Core. Her katman üstündekini bilmez. Bir modülü değiştirmek diğerlerini etkilemez.

Smart contract

Bilerek minimal — yalnızca hash'ler

// ConsentRegistry.sol — özet
contract ConsentRegistry {
  struct ConsentRecord {
    bytes32 contentHash;       // SHA-256(belge)
    bytes32 sigHash;           // SHA-256(imza)
    bytes32 tsaTokenHash;      // SHA-256(timestamp)
    bool    isRevoked;
    bytes32 revokeReasonHash;
    uint256 registeredAt;
    uint256 revokedAt;
    bool    exists;
  }

  function registerConsent(...)
    external onlyOwner { ... }

  function revokeConsent(...)
    external onlyOwner { ... }
}

Tasarım kararları

  • Sıfır PII on-chain. Yalnızca hash'ler. Kişisel veri zincirde asla bulunmaz.
  • onlyOwner write. Replay/spam koruması. Backend dışında kimse yazamaz.
  • Custom errors. Gas optimal, deşifre edilebilir hata mesajları.
  • Immutable revocation. isRevoked = true bir kez set edildi mi, geri dönüş yok.
  • Replay protection. Aynı consentId iki kere kaydedilemez.
  • Indexed events. Off-chain indexer için optimize.
Dashboard rolleri

Üç rol, üç farklı yetki seti

👨‍👩‍👦
Veli
veli / veli123
⬆️ Lisans Yükle

Sporcu velisi formu sisteme yükler.

🏟️
Kulüp Görevlisi
kulup / kulup123
🔍 Lisans Sorgula

Lisans ID ile kayıt ve doğrulama raporu görür.

🏆
TFF Yetkilisi
tff / tff123
⬆️ + 🔍 + 📋 + ⚙️

Tam erişim: yükleme, sorgulama, geçmiş, ayarlar.

※ Demo amaçlı client-side auth. Üretim için JWT / OAuth2 ile değiştirilmesi planlanmıştır.

Güvenlik postürü

Onbir katman, hepsi production'da aktif

🔐
TLS 1.2 + 1.3ECDHE-only · OCSP stapling · HSTS 1 yıl
🛡️
Strict CSPscript-src 'self' · frame-ancestors 'none'
🚪
Backend port closedInternet'ten 8000'e direkt erişim yok
🚦
Rate limitnginx 100 r/s · burst 50
🪪
No CDN dependencytweetnacl yerel · 3rd-party kaynak yok
🤐
Server fingerprint hiddennginx versiyonu sızmıyor
📦
AES-256-GCM storageAuthenticated encryption — silent corruption yok
✍️
Ed25519 signaturesModern, hızlı, post-quantum migrate kolay
📜
Hash-chain audit logAppend-only · her satır önceki hash'i içerir
♻️
Auto-renew TLSCertbot 12 saatte kontrol · 30 gün önce yeniler
🚀
Auto-recoveryrestart: unless-stopped · reboot sonrası otomatik kalkış
Doğrulanan skorlar

Bağımsız servisler tarafından live ölçüldü

Mozilla Observatory
A+
Score: 110/100 · Tests: 10/10 passed · 0 failed
testssl.sh / SSL Labs
A+
Final: 96/100 · Protocol: 100 · Key Exchange: 100
Backend port leak
CLOSED
tcp/8000 from internet → connection refused
Reboot recovery
AUTO
restart: unless-stopped · 3/3 container · backend (healthy)
Public API yüzeyi

Dokuz endpoint, hepsi nginx üzerinden

GET / → 302 → /dashboard/
GET /dashboard/ Static SPA
GET /dashboard/app.js Cache-Control: immutable, 30 gün
GET /health JSON status, chain, version
POST /consents Generic consent register
POST /verify Integrity verify
GET /evidence/{id} Forensic export bundle
POST /lisans TFF lisans register (dashboard)
GET /lisans/{id} TFF lisans query

Tüm istekler nginx'te TLS-terminate edilir, rate-limit'e tabidir, security header'larla zenginleştirilir, sonra backend'e proxy'lenir.

Sözümüz
"Tek bir bit değişirse bütün zincir kırılır
ve bu kırılma matematiksel olarak ispatlanabilir."

İşte adli kanıt seviyesinin tanımı. ForensicConsent bu standardı karşılıyor.

lisanszincir.com · production live · A+ Mozilla Observatory · A+ SSL Labs · all green
1 / 13
Space ile gez · F tam ekran · Home/End