Hej!
Jag bygger en end-to-end-krypterad meddelandeapp riktad mot aktivister och journalister. Jag använder Signal-protokollet som grund, men Dart-biblioteket saknar en funktion som kallas "sealed sender" — som döljer avsändarens identitet även för servern.
Eftersom det saknades byggde jag en egen implementation från grunden med:
X25519 för nyckelutbyte
HKDF-SHA256 för nyckelderivering
ChaCha20-Poly1305 för kryptering
Ed25519 för certifikatsignering
Servern agerar certifikatutfärdare och signerar avsändarcertifikat. Det betyder att en illvillig serveroperatör tekniskt sett skulle kunna förfalska avsändarens identitet. Försvaret mot detta är säkerhetsnummerverifiering utanför appen — samma modell som Signal använder.
Efter att ha jämfört med Signals egen källkod märkte jag en viktig skillnad: Signal hårdkodar sin CA-nyckel direkt i klientappen, medan min app hämtar och pinnar nyckeln från servern vid första anslutningen (TOFU). Det gör den första anslutningen till en potentiellt sårbar punkt.
Den viktigaste frågan: bör man hårdkoda en trust root i klientappen som Signal gör? Och hur fungerar det när olika operatörer kör sina egna servrar i ett federerat system?
Full teknisk dokumentation av konstruktionen finns här för den som vill gå djupare:
https://pastebin.com/TChBVM2X
Tack på förhand! <3