_ / \ /___\ [| |] [| o |] [| |] [|___|] / \ |_________|

TORWACHT

Proof-of-Work-Gate vor jedes Backend. Bots zahlen mit Rechenzeit. Menschen merken kaum etwas.

Live-Demo

Drei Instanzen, gleiche Seite dahinter, unterschiedliche Härte. Beim ersten Aufruf löst dein Browser die Challenge, danach proxyt das Gate unsichtbar das Backend (kein Redirect).

Was es tut

Das Prinzip

Torwacht stellt sich als Reverse Proxy vor deinen Dienst. Jeder Browser bekommt eine kryptografische Aufgabe (SHA-256). Erst die gültige Lösung öffnet das Tor: per HMAC-signiertem Token-Cookie, zustandslos, ohne Datenbank.

Warum es wirkt

Eine Lösung kostet ein Gerät Sekunden. Ein Botnetz mit zehntausend Clients zahlt das Zehntausendfache. Scraping, Credential-Stuffing und Volumen-Angriffe werden ökonomisch absurd.

Einstellbare Härte

Difficulty 8–24 (führende Nullbits) per TORWACHT_DIFFICULTY, fein in ×2-Schritten statt groben ×16-Sprüngen, serverseitig erzwungen und HMAC-signiert in der Challenge. Der Client kann sie nicht absenken.

Whitelabel ab Tag 1

Challenge-, Error- und Impressums-Seiten sind einzeln per Template-Verzeichnis überschreibbar. Eigenes Logo, eigene Texte, eigenes Impressum. Kein Maskottchen, kein Branding-Zwang.

Härtung

Single-Use-Challenges (IP+UA-gebunden), Replay-Schutz, Rate-Limits auf Challenge- und Verify-Endpunkt, Redirect-Sanitizing, Timing-sichere Vergleiche. govulncheck: keine Befunde.

Deployment

Eine statische Go-Binary oder docker compose up. Zwei Umgebungsvariablen genügen: Ziel-Backend und Secret. Hell-/Dunkel-Theme folgt dem System des Besuchers.

Bewiesen, nicht versprochen

2.569
Requests / Sekunde
0
Fehler im Lasttest
0,6 ms
Ø Latenz am Gate
10/10
Angriffstests bestanden
0
govulncheck-Befunde

Konfiguration

Alles per Umgebungsvariable. Zwei Pflicht, der Rest optional:

# docker compose: zwei Variablen genügen TORWACHT_TARGET=http://dein-backend:8080 TORWACHT_SECRET=$(openssl rand -hex 32)
VariableDefaultWirkung
TORWACHT_TARGETPflichtBackend, das geschützt wird (Pflicht)
TORWACHT_SECRETPflichtHMAC-Secret für Challenges + Tokens (Pflicht)
TORWACHT_LISTEN:8080Listen-Adresse des Gates
TORWACHT_DIFFICULTY16PoW-Härte in Nullbits, 8–24 (Ø 2^n Hashes), serverseitig geclamppt und signiert
TORWACHT_TOKEN_TTL24hGültigkeit des Token-Cookies
TORWACHT_RATE_LIMIT20Challenge-Seiten pro IP pro Minute
TORWACHT_VERIFY_RATE_LIMIT10Verify-Versuche pro IP pro Minute (Brute-Force-Schutz)
TORWACHT_CLIENT_IP_HEADERunsetAutoritativer Client-IP-Header (z.B. X-Real-IP) hinter Front-Ends, die XFF rotieren/anonymisieren
TORWACHT_TRUSTED_PROXIES(alle)CIDRs, deren X-Forwarded-For honoriert wird
TORWACHT_COOKIE_NAMEtorwacht_tokenName des Token-Cookies
TORWACHT_COOKIE_DOMAINunsetCookie-Domain (z.B. für Subdomain-übergreifende Tokens)
TORWACHT_BASE_PATH/.torwachtNamespace der Gate-Endpunkte
TORWACHT_BYPASS_PATHSunsetPfade ohne Gate (z.B. Healthchecks, Webhooks)
TORWACHT_SITE_NAMETorwachtName auf der Challenge-Seite
TORWACHT_TITLEautoTitel der Challenge-Seite
TORWACHT_MESSAGEautoEigener Text auf der Challenge-Seite
TORWACHT_FOOTERautoFußzeile der Challenge-Seite
TORWACHT_IMPRESSUMunsetURL zum Impressum
TORWACHT_TEMPLATE_DIRunsetVerzeichnis mit eigenen Templates (challenge/error/impressum)
TORWACHT_ASSETS_DIRunsetVerzeichnis mit eigenen Assets (Logo, CSS)