Un sistema di messaggistica effimera sulla rete Tor che puoi ospitare tu stesso
http://mwgnkmbbgziasslmbqwo5qaeuxpftjbe63y6li62vijk3lpd23a66oyd.onion/
Il Concetto: Dead Drop Digitale
Durante la Guerra Fredda, agenti e informatori utilizzavano i “dead drop” — luoghi fisici prestabiliti dove lasciare messaggi senza mai incontrarsi. Un mattone allentato in un muro, una cavità in un albero, uno scomparto segreto in una panchina del parco.
VaporDrop porta questo concetto nell’era digitale. È un punto di scambio anonimo sulla rete Tor dove due persone possono depositare e ritirare messaggi e file senza conoscersi, senza registrarsi, senza lasciare tracce.
La differenza fondamentale? Potete ospitarlo voi stessi. Il server è vostro, i dati sono sotto il vostro controllo, e quando spegnete il container Docker, tutto svanisce.
Come Funziona l’Accesso
Dimenticate username e password tradizionali. VaporDrop utilizza un sistema mnemonico chiamato Brain Key.
Sei Parole, Una Identità
Per accedere servono sei parole di almeno quattro caratteri ciascuna. Queste parole vengono elaborate attraverso PBKDF2 con 100.000 iterazioni per generare un seed, che a sua volta genera una coppia di chiavi crittografiche P-256. La stessa combinazione di parole produce sempre la stessa identità.
Non c’è “password dimenticata” perché non c’è nessun database utenti. Le vostre sei parole sono la vostra identità.
Scegliere Parole Memorizzabili
Il sistema non richiede parole complicate. Potete usare:
- Il ritornello di una canzone: “sotto questo sole splendido cammino”
- Un titolo di libro: “cent anni solitudine garcia marquez”
- Una frase personale: “nonna maria pasta domenica tavolo”
- Parole in sequenza logica: “roma milano napoli torino firenze bologna”
L’importante è che siano parole che potete ricostruire mentalmente senza doverle scrivere da nessuna parte.
Il Numeric ID
Una volta effettuato l’accesso, il sistema vi assegna un Numeric ID nel formato 12345678-90. Questo è l’identificativo che condividete con chi deve contattarvi via messaggio. È derivato dalla vostra chiave pubblica, quindi le stesse sei parole produrranno sempre lo stesso Numeric ID.
Messaggi e File: Due Modalità
📨 Messaggi di Testo
Basta il Numeric ID del destinatario. Il messaggio viene cifrato AES-256-GCM nel browser prima dell’invio.
📁 Trasferimento File
Fino a 1GB, cifrati chunk per chunk. Richiede lo scambio delle chiavi pubbliche complete (130 caratteri hex).
Flusso Trasferimento File
- Scambio chiavi — Il destinatario copia la sua chiave pubblica e la comunica al mittente
- Cifratura locale — Il mittente incolla la chiave, trascina il file — viene cifrato nel browser
- Upload chunk — I chunk cifrati (1MB ciascuno) vengono caricati sul server
- Download e decifratura — Il destinatario scarica, decifra localmente, e il server cancella i chunk
Crittografia End-to-End
Tutto il codice crittografico viene eseguito nel browser. Il server non vede mai dati in chiaro.
Stack Crittografico
| Componente | Algoritmo | Note |
|---|---|---|
| Key Exchange | ECDH P-256 | 65 bytes = 130 hex |
| Symmetric Encryption | AES-256-GCM | IV random 12 bytes |
| Brain Key Derivation | PBKDF2-SHA256 | 100.000 iterazioni |
| Onion Key Derivation | Argon2id | 64MB RAM, 3 iter |
| Onion Service Key | Ed25519 | Deterministica |
| RAM Protection | MemGuard | Blocco pagine |
Protezioni Attive nel Backend
- Anti-replay: ogni richiesta include un nonce unico, cachato per 24 ore
- Rate limiting: massimo 60 richieste al minuto per IP
- Timing jitter: ritardo random 50-500ms per prevenire timing attacks
- Padding: messaggi con padding random per mascherare la lunghezza
- MemGuard: chiavi bloccate in RAM, non swappabili su disco
- Constant-time comparison: confronti hash resistenti a timing attacks
Il Pulsante Destroy
Nella dashboard trovate un pulsante rosso: 🔥 Destroy.
Cancella istantaneamente:
- La chiave privata memorizzata nel browser
- Tutti i contatti salvati localmente
- Le preferenze del tema
- Qualsiasi dato locale associato a VaporDrop
Nota: questo non cancella i messaggi già depositati sul server per voi. Quelli rimangono fino alla scadenza automatica (7 giorni) o fino a quando li recuperate.
Vita dei Dati sul Server
Messaggi e file hanno una vita massima di 7 giorni.
Trascorsa una settimana dal deposito, un garbage collector automatico li elimina definitivamente. Questa scelta bilancia due esigenze: dare tempo sufficiente al destinatario di recuperare i dati, e non accumulare indefinitamente materiale sul server.
Per esigenze diverse potete modificare le costanti nel codice sorgente e deployare la vostra istanza personalizzata.
Self-Hosting con Docker
VaporDrop è distribuito come container Docker. Funziona su qualsiasi sistema: Linux, Windows, macOS.
Download:
- 📦 Codice sorgente: github.com/gabrix73/vapordrop
- 🐳 Immagine Docker: hub.docker.com/r/gabx788/vapordrop
Requisiti
- Docker e Docker Compose installati
- Almeno 512MB di RAM disponibili
- Connessione internet per la rete Tor
- Spazio disco per i file temporanei (consigliato 10GB)
Installazione Rapida (DockerHub)
# Scarica l'immagine pre-compilata
docker pull gabx788/vapordrop:latest
# Crea directory per i file
mkdir -p vapordrop/static vapordrop/file_storage
cd vapordrop
# Scarica il frontend
curl -o static/index.html https://raw.githubusercontent.com/gabrix73/vapordrop/main/static/index.html
# Avvia (sostituisci con la tua frase segreta)
docker run -d \
--name vapordrop \
-e VAPOR_KEY="la-tua-frase-segreta-molto-lunga" \
-v ./static:/app/static:ro \
-v ./file_storage:/app/file_storage \
--cap-add IPC_LOCK \
--read-only \
--tmpfs /tmp:size=256M \
--tmpfs /run:size=64M \
gabx788/vapordrop:latest
# Trova il tuo indirizzo .onion
docker logs -f vapordrop
Installazione da Sorgente (GitHub)
# Clona il repository
git clone https://github.com/gabrix73/vapordrop.git
cd vapordrop
# Imposta la chiave segreta
export VAPOR_KEY="la-tua-frase-segreta-molto-lunga"
# Builda e avvia
docker compose up -d --build
# Trova il tuo indirizzo .onion
docker compose logs -f
Windows/macOS con Docker Desktop
Installa Docker Desktop, avvialo, apri un terminale e segui gli stessi comandi. Docker Desktop gestisce automaticamente la VM Linux sottostante.
La Variabile VAPOR_KEY
VAPOR_KEY è la frase segreta che genera deterministicamente l’indirizzo .onion del vostro servizio.
- Stessa frase = stesso indirizzo .onion
- Frase diversa = indirizzo diverso
Attenzione: Se perdete la frase, perdete l’indirizzo. Se qualcuno la conosce, può impersonare il vostro servizio. Trattatela come una master password.
Dockerfile (Multi-Stage Hardened)
# STAGE 1: Build
FROM golang:1.22-alpine AS builder
RUN apk add --no-cache git ca-certificates
WORKDIR /build
COPY go.mod go.sum* ./
RUN go mod download 2>/dev/null || true
COPY main.go .
RUN [ -f go.mod ] || go mod init vapordrop
RUN go mod tidy
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build \
-ldflags="-s -w -extldflags '-static'" \
-trimpath -o vapordrop main.go
# STAGE 2: Runtime
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
tor ca-certificates && rm -rf /var/lib/apt/lists/*
RUN groupadd -g 1000 vapor && \
useradd -r -s /bin/false -d /app -u 1000 -g 1000 vapor
WORKDIR /app
COPY --from=builder /build/vapordrop /app/vapordrop
COPY static/ /app/static/
RUN chown -R vapor:vapor /app && chmod 500 /app/vapordrop
USER vapor
ENTRYPOINT ["/app/vapordrop"]
docker-compose.yml (Hardened)
services:
vapordrop:
build: .
container_name: vapordrop
volumes:
- ./static:/app/static:ro
- ./file_storage:/app/file_storage
environment:
- VAPOR_KEY=${VAPOR_KEY:?VAPOR_KEY obbligatoria}
# Security
cap_add:
- IPC_LOCK # Per MemGuard
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
read_only: true
# RAM-only temp dirs
tmpfs:
- /tmp:size=256M,mode=1777,uid=1000,gid=1000
- /run:size=64M,mode=1777
deploy:
resources:
limits:
memory: 512M
restart: unless-stopped
Primo Avvio
Nei log vedrete:
⚙️ Key derivation with Argon2id (~64MB RAM, ~1 sec)...
⚙️ Starting VaporDrop Node...
⚙️ Creating Onion Service v3...
═══════════════════════════════════════════════════════
✅ VAPORDROP ONLINE
🔗 http://abc123xyz456...onion
═══════════════════════════════════════════════════════
Struttura del Progetto
vapordrop/
├── main.go # Backend Go (~700 righe)
├── go.mod # Dipendenze: memguard, bine, crypto
├── go.sum
├── Dockerfile # Multi-stage hardened
├── docker-compose.yml # Con security options
├── static/
│ └── index.html # Frontend completo (~500 righe)
└── file_storage/ # Directory chunk (auto-creata)
Endpoint API
| Endpoint | Metodo | Funzione |
|---|---|---|
/api/register | POST | Registra Numeric ID ↔ Public Key |
/api/resolve/{id} | GET | Risolve ID in Public Key(s) |
/api/send | POST | Deposita messaggio cifrato |
/api/fetch | POST | Ritira messaggi (e li cancella) |
/api/file/init | POST | Inizia trasferimento file |
/api/file/chunk/{id}/{n} | POST | Carica chunk cifrato |
/api/file/pending/{pk} | GET | Lista file in attesa |
/api/file/download/{id}/{n} | GET | Scarica chunk |
/api/file/complete/{id} | POST | Conferma download (cancella) |
/api/stats | GET | Statistiche pubbliche |
Personalizzazione
Costanti modificabili in main.go:
const (
MessageTTL = 7 * 24 * time.Hour // Durata messaggi
FileTTL = 7 * 24 * time.Hour // Durata file
MaxFileSize = 1 << 30 // 1GB max
FileChunkSize = 1 << 20 // 1MB per chunk
MaxPendingFiles = 1000 // File in attesa
MaxIdentities = 100000 // Identità registrate
RateLimitWindow = 1 * time.Minute // Finestra rate limit
MaxRequestsPerIP = 60 // Richieste per IP
)
Domande Frequenti
Cosa succede se dimentico le sei parole?
Perdete l’accesso a quell’identità. Non esiste recupero. I messaggi depositati per voi rimarranno sul server fino alla scadenza, ma non potrete leggerli.
Posso usare le stesse parole su nodi diversi?
Sì. Le stesse sei parole generano la stessa identità ovunque. Potete accedere dal nodo pubblico o dal vostro nodo privato con le stesse credenziali.
Il gestore del server può leggere i miei messaggi?
No. La cifratura avviene nel browser prima dell’invio. Il server riceve e memorizza solo blob cifrati.
Come verifico che il codice sia sicuro?
Il frontend è un singolo file HTML ispezionabile. Aprite gli strumenti sviluppatore del browser e verificate che le chiamate crittografiche avvengano localmente prima di qualsiasi fetch al server.
Perché P-256 e non X25519?
Web Crypto API nei browser supporta nativamente P-256. Per curve non-NIST servirebbe includere librerie JavaScript esterne, aumentando la superficie di attacco.
Beta Testing & Feedback
⚠️ VaporDrop è attualmente in fase di testing. Il software è funzionante ma potrebbe contenere bug o comportamenti imprevisti.
Cerchiamo attivamente feedback da parte degli utenti. Se riscontrate bug, disfunzionamenti, o avete critiche e suggerimenti, contattateci su IRC:
| Connessione | Indirizzo | Porta | Note |
|---|---|---|---|
| Clearnet (TLS 1.3) | irc.virebent.art | 6667 | Connessione cifrata |
| Tor (Onion) | 2xz3ngedsne2ngd3blpgnrqmeitffnzsnjacdjinu63yi5tjcyfitbid.onion | 6667 | No TLS (già cifrato da Tor) |
- Canale:
#lobby - Contatto:
Gabx
Conclusione
VaporDrop non è per tutti. Non ha le emoji animate di Telegram, non ha le spunte blu di WhatsApp, non ha i gruppi con centinaia di persone di Signal.
È uno strumento minimale per uno scopo specifico: permettere a due persone di scambiarsi informazioni in modo effimero, anonimo, e verificabile.
Se avete bisogno di un canale di comunicazione che non lasci tracce, che non richieda fiducia in terze parti, e che possiate ospitare voi stessi — VaporDrop è un’opzione.
Sei parole. Nessun account. Nessuna traccia.
VaporDrop è software sperimentale distribuito senza garanzie. Per comunicazioni critiche, verificate il codice sorgente e considerate di ospitare la vostra istanza.
Lascia un commento
Devi essere connesso per inviare un commento.