Blog van Jeroen van der Gun

Tweet als gratis digitale handtekening

14 april 2010, 0:37

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.

Reacties (1)

Maarten Baert
14 april 2010, 11:02
>> Aangenomen dat geen gevoelige informatie in het programma mag worden opgeslagen, [...]
Daarmee maak je het jezelf wel heel moeilijk. Is het zo'n groot probleem dat er ergens in je programma een verborgen cryptografische sleutel zit? Als je die sleutel met verschillende bewerkingen samenstelt uit een aantal andere gegevens die in je programma zitten, kan je die sleutel in principe enkel te weten komen door het programma op assembly-niveau uit elkaar te halen en te kijken wat er gebeurt. Voor grote programma's zoals firefox is dit waarschijnlijk geen goed idee, maar voor een minder vaak gebruikt programma is dit toch meer dan genoeg?

>> Om dit daadwerkelijk in C++-code om te zetten, is dit derhalve veel meer werk dan het relatief onschuldige rekenvoorbeeldje doet vermoeden. [...]
Weet je zeker dat er op het internet geen kant en klare code bestaat voor RSA? Ik weet dat er big integer calculators bestaan waarmee je de benodigde berekeningen kan uitvoeren (en zoiets kan je eventueel best zelf maken), het enige wat je dan nog mist is een snelle methode om priemgetallen te bedenken. Dat zou alles wel een heel stuk simpeler maken.
opt.
opt.
10 × 4 =

Feeds Blogbelevenisoptimalisatie

  1. Informatie over de auteur staat op mijn portfoliosite, met name in mijn profiel.
  2. Voel u vrij te reageren op artikelen. Gaat uw reactie niet over een specifiek artikel, dan kunt u het gastenboek gebruiken.
  3. U kunt meldingen van nieuwe berichten ontvangen via feeds: zie de instructies. Dit geldt voor zowel blogitems als reacties.
Blognavigatie: 20 19 18 17 16 15 14
Copyright © 2005–2010 Jeroen van der Gun, alle rechten voorbehouden.
Lees mijn disclaimer en privacyverklaring.
Alle pagina’s van deze site zijn printvriendelijk.
W3C: XHTML 1.0 W3C: CSS level 2 Atom: Valid
Wat betekenen deze pictogrammen?