// security

Il modello di sicurezza.

Cosa protegge una nota, cosa il server può e non può vedere, e dove sono i confini, detto chiaramente — perché una sicurezza che non puoi capire non è sicurezza.

Crittografia

  • Cifratura: ogni nota viene sigillata sul tuo telefono con AES-256-GCM (un nonce di 12 byte e un tag di autenticazione di 16 byte) prima di caricare qualsiasi cosa. Il testo cifrato manomesso fallisce l'autenticazione invece di decifrarsi in spazzatura.
  • Derivazione della chiave: la chiave proviene da HKDF-SHA256 su 32 nuovi byte casuali — la chiave del frammento — più un salt casuale di 16 byte. Quei 32 byte vanno nel #frammento del link e in nient'altro.
  • Passphrase (facoltativa): se ne imposti una, viene rafforzata con PBKDF2-HMAC-SHA256 a 600.000 iterazioni e mescolata nella derivazione, così il link da solo non basta più. I tentativi errati falliscono localmente nel browser del destinatario e non consumano mai visualizzazioni.
  • Verificato due volte: le implementazioni Swift e Kotlin nelle app e l'implementazione WebCrypto nel visualizzatore vengono verificate a vicenda con vettori di test generati in modo indipendente, così una nota sigillata da una si apre sempre nell'altra.

Il link con chiave nel frammento

Un link di nota è del tipo burnpony.app/n/<id>#<key>. Tutto ciò che segue il # è un frammento di URL, e i browser non inviano i frammenti nelle richieste HTTP — né a questo server né a nessun altro. Il server apprende l'ID casuale della nota; la chiave esiste solo nel link stesso e nel browser del destinatario durante la lettura. Ecco perché «il server non può leggere la tua nota» è una proprietà di come funziona il web, non una promessa.

Cosa memorizza il server — e non può leggere

Finché una nota è viva, il server conserva: l'ID casuale della nota, il blob di testo cifrato sigillato, i timestamp di creazione e scadenza, il limite e il conteggio delle visualizzazioni, se è stata richiesta una conferma di lettura, e un hash del token di gestione che permette alla tua app di bruciare la nota in anticipo. Se le ricevute sono attive, vengono registrati i timestamp di apertura. Questo è l'inventario. Non ha mai la chiave, il testo della nota, né l'impostazione di occultamento automatico — quella viaggia cifrata dentro la nota. La limitazione del tasso di creazione usa hash IP con un segreto del server che scadono dopo circa due ore, non registri di indirizzi grezzi.

Bruciare, e cosa resta

Quando viene recuperata l'ultima visualizzazione consentita, il testo cifrato viene eliminato nella stessa transazione del database che lo ha servito. Le note scadute vengono rimosse da una scansione che gira ogni cinque minuti. E, cosa cruciale, una nota bruciata, una nota scaduta e una nota mai esistita restituiscono esattamente la stessa risposta — il server non può essere usato come oracolo per confermare che un dato link sia mai stato reale.

Il visualizzatore

I destinatari aprono un'unica pagina autonoma: nessun framework, nessun cookie, nessuna analitica, nessuna richiesta se non a questo server per la nota sigillata stessa. Porta una Content-Security-Policy rigorosa (default-src 'none'), una direttiva noindex e una politica no-referrer perché il link non trapeli mai tramite gli header referrer. La decifratura avviene nel WebCrypto integrato del browser. La pagina è abbastanza breve da essere verificata con Visualizza sorgente — è un obiettivo di progettazione, non un caso.

Conferme di lettura, onestamente

Le ricevute sono facoltative per nota. Il destinatario vede «Il mittente sarà avvisato quando questa nota verrà aperta» prima di rivelarla. La notifica che ricevi è deliberatamente generica — «Una nota è stata aperta.» con solo l'ID della nota allegato — così nulla del contenuto della nota transita dai server del provider di notifiche.

Modello di minaccia

BurnPony protegge la riservatezza e l'integrità di una nota contro il server, gli osservatori di rete e chiunque trovi in seguito l'URL senza il suo frammento — e limita per quanto tempo e quante volte una nota è leggibile. Presume che il tuo telefono e il browser del destinatario si comportino come documentato. Non difende contro malware su nessuno dei due estremi, né contro un destinatario che copia, cattura o fotografa la nota mentre è visibile — nessuno strumento brucia-dopo-lettura può. L'autodistruzione limita l'accesso futuro; non può sorvegliare il momento della lettura.

Limiti onesti

  • Il link è la chiave. Chiunque ottenga il link completo (e la passphrase, se impostata) prima che bruci può leggere la nota. Invialo su un canale a cui affideresti il segreto stesso, o aggiungi una passphrase e condividila separatamente.
  • Gli schermi possono essere catturati. Il conto alla rovescia di occultamento automatico riduce il tempo per lo shoulder-surfing; non è una protezione dagli screenshot.
  • Telefono perso, gestione persa. Le note che hai inviato continuano a bruciare e scadere secondo la propria pianificazione, ma senza la scheda Inviati dell'app perdi la possibilità di bruciarle in anticipo o controllarne lo stato.
  • Esistono metadati a livello di rete. Come qualsiasi server web, questo vede gli indirizzi IP che si connettono a livello di rete mentre serve le richieste. Il server web davanti al relay è configurato con il logging degli accessi disattivato, e l'applicazione conserva solo gli hash IP salati di breve durata descritti sopra.

La specifica esatta

Ogni affermazione di questa pagina è espressa con precisione, costante per costante, sulla pagina del protocollo v1, scritta sul codice congelato in il repository pubblico e verificabile con i vettori di test condivisi.

Aperto all'ispezione

Il visualizzatore è verificabile oggi su ogni link di nota, e il cuore crittografico, il visualizzatore e il server relay sono previsti per la pubblicazione — vedi la pagina open source per lo stato.

Segnalare una vulnerabilità

Hai trovato qualcosa? Scrivi a NorseHorse@norsehor.se — cifrato con la chiave PGP se preferisci. Le segnalazioni vanno direttamente allo sviluppatore, e le correzioni escono in fretta perché non c'è alcun comitato di mezzo.