Notepad++ is een veelgebruikte teksteditor voor programmeurs. In dit programma zit een automatisch updatemechanisme ingebouwd. Dit controleert vanzelf op het internet of er updates zijn en na het vragen om een bevestiging worden de updates vervolgens geïnstalleerd. Prachtig zo’n systeem? Op het eerste gezicht wel, maar er zit een addertje onder het gras.
Nu komt namelijk het verhaaltje dat veel dingen op het Internet over onbeveiligde verbindingen gebeuren. Programma’s zonder digitale handtekening — of met handtekening van een onbekende partij, maar dat terzijde — downloaden over onbeveiligde verbindingen is überhaupt niet ideaal. Dit is gelukkig echter een eenmalig risico: u zegt als het ware dat u op dit moment uw huidige internetverbinding vertrouwt. Bij updatesystemen wordt dit echter anders: nu moet u ook al uw toekomstige internetverbindingen kunnen vertrouwen. Maakt u ooit een onbetrouwbare internetverbinding in de toekomst, dan kan uw computer worden wijsgemaakt dat een programma dat uw computer overneemt, een gewenste update is en is de computer vanaf dat moment op afstand bestuurbaar.
Notepad++ heeft dus geen veilig systeem, hoewel het risico iets wordt gereduceerd doordat u de installatie van updates moet bevestigen. Voor Really Simple Aggregator vraag ik me al een tijd lang af, hoe ik een automatisch updatemechanisme kan inbouwen dat wel waterdicht is. Er zijn grofweg twee reguliere oplossingsrichtingen: digitale handtekeningen en SSL-certificaten. Het eerste is wat Firefox gebruikt bij de initiële download, het tweede is wat Firefox gebruikt om zichzelf te updaten. Beide zijn echter nogal prijzig, vooral het eerste.
Als alternatief zou zelf een systeem voor digitale handtekeningen geprogrammeerd kunnen worden. Aangenomen dat geen gevoelige informatie in het programma mag worden opgeslagen, is hiervoor asymmetrische encryptie vereist, zoals het RSA-algoritme. Hiervoor moet met extreem grote getallen met evengrote nauwkeurigheid worden gerekend. Om dit daadwerkelijk in C++-code om te zetten, is dit derhalve veel meer werk dan het relatief onschuldige rekenvoorbeeldje doet vermoeden. Met een of andere Crypto API van Windows zou dit wellicht ook mogelijk zijn, maar de praktische implementatie hiervan lijkt me erg ingewikkeld.
Hierdoor stranden we bij de SSL-certificaten. SSL-certificaten kunnen met OpenSSL zelf worden gegenereerd en vervolgens door Apache in gebruik worden genomen. Het zelf-ondertekend certificaat zou dan door het installatieprogramma in Windows kunnen worden geïnstalleerd, waarna beveiligde verbindingen met de updateserver hieraan getoetst kunnen worden. Als ik een eigen server had die 24/7 online was, dan zou dit zeker de ideale oplossing zijn geweest. Bij shared hosting is dit echter niet gratis, omdat een eigen IP-adres (of poortnummer) nodig is, zelfs al gebruikt men een zelf-ondertekend certificaat.
Dus wat doet men als men iets niet heeft en er geen geld aan uit wil geven? Juist, jatten. De update kan zelf over een onbeveiligde verbinding worden aangeboden, als daarna maar de SHA-1-hash over een beveiligde verbinding wordt geverifieerd. De noodzakelijke beveiligde gegevensoverdracht is hiermee beperkt tot 20 bytes, oftewel 40 hexadecimale karakters. Laat er nou net een service bestaan waarmee u wel 140 karakters kunt verzenden en waarmee ook nog eens SSL-verbindingen mogelijk zijn: Twitter. Twitter biedt zelfs feeds van tweets per gebruiker, waardoor het helemaal eenvoudig wordt voor Really Simple Aggregator om de correcte SHA-1-vingerafdruk binnen te halen. Deze kan vervolgens worden vergeleken met de berekende vingerafdruk van de update, waarna de update kan worden geaccepteerd of verworpen.
Uiteraard zit hier wel een nadeel aan en dat is de afhankelijkheid van de continuïteit van Twitter zijn de huidige vorm. De privacy is in elk geval goed te regelen: het reguliere updatemechanisme kan via de eigen onbeveiligde website blijven verlopen; Twitter hoeft alleen eenmalig te worden geraadpleegd zodra er daadwerkelijk een update is gevonden. Ik ben daarom benieuwd wat u van dit algoritme vindt. Ik ben van plan om het daadwerkelijk te implementeren in de volgende versie van de aggregator.