Anonieme end-to-end versleutelde chat, gerouteerd over het Tor-netwerk. Een terminal-gebaseerde chatclient en hidden service die berichten met PGP versleutelt voordat ze je apparaat verlaten.
SecureTorChat is een beveiligde berichtendienst die volledig draait op een Tor hidden service. Er is geen publiek IP-adres, geen centrale webhost en geen leesbare kopie van je gesprekken op de server: berichten worden bij de afzender versleuteld met de publieke PGP-sleutel van de ontvanger en pas bij de ontvanger weer ontsleuteld.
Het project bestaat uit twee delen:
- Client — een terminal-app die al het verkeer via een lokale Tor SOCKS5-proxy stuurt. Berichten worden lokaal bewaard in een met AES-256-GCM versleutelde SQLite-vault, beveiligd met een eigen wachtwoord.
- Server — een minimale HTTP-API die alleen bereikbaar is via een
.onion-adres. Wachtwoorden worden gehasht met bcrypt en berichten verdwijnen van de server zodra ze zijn opgehaald.
Client (terminal) Tor-netwerk Server (hidden service)
┌──────────────────────────┐ ┌──────────────┐ ┌──────────────────────────────┐
│ main.py (UI/menu) │ │ │ │ tor_server.py (onion host) │
│ pgp.py (PGP) │ PGP-ct │ Tor SOCKS5 │ .onion │ server.py (HTTP :8080) │
│ local_store (AES-GCM) │ ─────────► │ 127.0.0.1: │ ─────────► │ models.py (logica) │
│ tor.py (circuit) │ │ 9050 │ │ database.py (SQLite) │
└──────────────────────────┘ └──────────────┘ └──────────────────────────────┘
- De server start een Tor hidden service en draait lokaal op
127.0.0.1:8080. - De client start zijn eigen Tor-circuit en stuurt alle requests via een SOCKS5-proxy.
- Elk bericht wordt met de publieke PGP-sleutel van de ontvanger versleuteld.
- De server ziet enkel ciphertext en verwijdert het bericht na uitlevering.
| Laag | Technologie |
|---|---|
| Taal | Python 3.10+ |
| Anonimiteit | Tor (Expert Bundle + Stem) |
| End-to-end encryptie | PGPy (OpenPGP, RSA 2048) |
| Lokale versleuteling | cryptography (AES-256-GCM, PBKDF2-HMAC-SHA256) |
| Wachtwoord-hashing | bcrypt |
| Opslag | SQLite |
| HTTP-client | requests |
Vereisten: Python 3.10 of nieuwer en een werkende internetverbinding. De Tor Expert Bundle wordt bij de eerste start automatisch gedownload.
# 1. Installeer de dependencies (eenmalig, vanaf de repo-root)
pip install -r requirements.txt
# 2. Start de server
cd server
py server.pyDe server start de hidden service en print na enkele seconden het .onion-adres,
bijvoorbeeld http://xxxxx.onion/. Noteer dit adres.
Start daarna de client:
cd client
py main.pyBij het opstarten vraagt de client om het .onion-adres van de server.
Druk op Enter om de default uit client/config.py te gebruiken, of typ het
adres van je eigen server (met of zonder http://).
Let op: de lokale message-vault en de PGP-sleutel zijn beveiligd met eigen wachtwoorden. Deze worden nergens opgeslagen; raak je ze kwijt, dan zijn de lokaal bewaarde berichten niet meer te lezen.
Python 3.13+: PGPy 0.6.0 importeert de module
imghdr, die sinds Python 3.13 uit de standaardbibliotheek is verwijderd.client/imghdr.pyis een kleine compatibiliteitsmodule die dit opvangt.
SecureTorChat/
├── client/
│ ├── main.py # CLI-menu, registratie, chatweergave
│ ├── config.py # Tor-instellingen, onion-adres, proxy
│ ├── tor.py # download + start Tor-circuit
│ ├── pgp.py # genereren, versleutelen, ontsleutelen (OpenPGP)
│ ├── imghdr.py # compat-shim voor PGPy op Python 3.13+
│ ├── local_store.py # lokale AES-256-GCM versleutelde opslag
│ └── build.bat # PyInstaller-build naar losse .exe
├── server/
│ ├── server.py # entry-point: DB + hidden service + HTTP-server
│ ├── tor_server.py # download + start Tor hidden service
│ ├── handlers.py # HTTP-routing naar de API-logica
│ ├── models.py # gebruikers, berichten, sleutels, sessies
│ ├── database.py # SQLite-schema en connectie
│ ├── config_server.py # server- en onion-instellingen
│ └── sql_console.py # interactieve SQLite-console voor beheer
├── requirements.txt
├── LICENSE
├── .gitignore
└── README.md
- End-to-end encryptie — berichten worden met PGP versleuteld voor de ontvanger; de server bewaart uitsluitend ciphertext.
- Sessietokens — na login krijg je een token; het versturen en ophalen van berichten is daarmee gebonden aan je account.
- Geen leesbare kopie op de server — berichten worden verwijderd zodra ze zijn opgehaald.
- Lokale vault — de gespreksgeschiedenis is versleuteld met AES-256-GCM; de sleutel wordt afgeleid via PBKDF2 (300.000 iteraties).
- Geen metadata richting het internet — alles loopt via een Tor hidden service.
- Onion-sleutels en de database staan in
.gitignoreen worden niet verspreid.
Dit is een portfolio-prototype, geen productiesysteem. Zie de roadmap voor bekende beperkingen.
- De PGP-privésleutel bij generatie van een eigen passphrase voorzien.
- Berichtbezorging met bevestiging (ack) in plaats van direct verwijderen.
- Installatie- en draaistappen voor Linux/macOS verder uitwerken.
- Tests toevoegen voor de API en de lokale opslag.
- Leon Boussen — @leonboussen
Dit project valt onder de MIT-licentie — Copyright (c) 2026 Leon Boussen.