Online Privacy met OpenPGP

Het mooiste aan Internet is in mijn ogen dat er plek is voor iedereen en voor elke overtuiging. Een steeds vaker gehoorde overtuiging is die van het recht op privacy, ofwel het niet-worden-afgeluisterd. In dit artikel bespreken we het gebruik van een belangrijk instrument daarvoor, de OpenPGP standaard. De kennismaking zal even moeilijk zijn, maar na wat oefenen moet iedereen het kunnen, en daarna heb je er alleen maar voordeel van.

Dit artikel verscheen eerder in Linux Magazine, aflevering 6 van 2001

Wat is privacy?

Met privacy bedoelen we in eerste instantie de bescherming tegen luistervinken. Dat kan zijn ter voorkoming van collega's die "per ongeluk" files in je account onder ogen krijgen, of ter voorkoming van meekijkende systeembeheerders van systemen waar een email langs reist. In tweede instantie hebben we het ook over het zekerstellen van de afzender van een bericht; je wilt liever niet dat iemand de rol van jouw geliefde gaat spelen, alleen maar een reply te krijgen met jouw zoetsappigste kant...

We richten ons hier niet op banners die je browse-gedrag traceren; misschien komen we daar later nog eens op terug. We beperken ons hier tot de privacy van berichten en files.

Op dit gebied is een enkeling, Phil Zimmerman, al jarenlang heel actief met de software PGP, wat staat voor Pretty Good Privacy. De gebruikte fileformaten uit deze software is inmiddels tot standaard verheven, onder de naam OpenPGP. En sinds PGP zelf commercieel is gemaakt, is er ook een open source implementatie van die standaard voorhanden onder de naam GnuPG, de Gnu Privacy Guard. Die laatste gaan we hier bekijken.

Sleutels

Stel, je wilt je liefdesbrieven voor anderen verborgen houden. Dan stop je die in een kistje, met een slot er op. Alleen jij hebt de sleutel, dus alleen jij kunt er bij. De computervariant hierop is natuurlijk een cijferslot, met hele lange getallen om het inbreken door proberen van alle cijfercombinaties te bemoeilijken. Zo'n cijfercombinatie heet, heel logisch, een sleutel, of in het Engels een key.

Nu willen we in de computerwereld vaak wat ingewikkelder dingen, bijvoorbeeld het verzenden van versleutelde informatie over het Internet. Dan is het nodig dat de ene kant de informatie versleutelt op zo'n manier dat alleen de ontvanger het kan ontsleutelen. Dit heet encryptie, en het werkt als een slot dat door iedereen (met een zogenaamde publieke sleutel) op slot kan worden gedraaid, maar dat alleen door de eigenaar (met een bijbehorende geheime sleutel) kan worden opengedraaid.

Een publieke en geheime sleutel horen bij elkaar; ze worden een sleutelpaar genoemd, en dat is omdat ze elkaars werking precies omkeren. Laten we maar eens zo'n sleutelpaar gaan aanmaken met GnuPG.

gpg --gen-key
Als je gevraagd wordt het commando opnieuw te starten: gewoon doen, er is dan wat spul geïnstalleerd, dat gebeurt alleen de eerste keer.

Er wordt je nu gevraagd welke soort sleutel je wenst. De soort sleutel geeft eigenlijk vooral aan van welke makelij je cijferslot moet zijn; namen als RSA, DSA, ElGamal, enzovoorts zijn namen van zogenaamde encryptie-algoritmen, dat wil zeggen complexe berekeningen die van de sleutel af zullen hangen. De default voldoet normaalgesproken uitstekend.

Je moet ook een sleutellengte kiezen. Hoe langer een sleutel, hoe moeilijker de encryptie te kraken valt (meestal een verdubbeling voor elke extra bit!), maar ook hoe langer het gewone gebruik duurt. Het is prima om 1024 bits te kiezen als je er geen bankbeveiliging van af hoeft te laten hangen.

Tenslotte moet je aangeven of de sleutel ooit verloopt; normaalgesproken hoeft dit niet te gebeuren, dus je kiest voor een eeuwigdurende sleutel.

Je kunt nu aangeven dat alles correct is, en doorgaan met het geven van je naam, email adres en een eventueel commentaar (suggestie: vul als commentaar eerst maar eens "test" in). Nadat je dat alles accepteert moet je een password ingeven, tweemaal ter controle zelfs. Dit password heb je straks nodig voor elke keer dat je je geheime sleutel wilt gebruiken. Onthoud hem dus goed, anders kun je straks je binnenkomende email niet meer lezen!

Vervolgens zie je dat er een random getal wordt geprikt als basis voor de sleutels; dit duurt even, omdat het heel belangrijk is dat de sleutel echt nergens van af hangt, want dat zou de kraakbaarheid verhogen. Het helpt doorgaans als je wat typt, muist of diskdrivet, omdat daaruit informatie wordt ingewonnen voor de random-generatie van het onder water gebruikte character device /dev/random.

Versleuteling

Okay, je hebt nu sleutels. Je kunt daarnaar verwijzen door een woord uit de omschrijving die je gegeven hebt, bijvoorbeeld het email adres of het commentaar. Je kunt dat bijvoorbeeld doen om een file te versleutelen:

echo 'Hello world!' >hello
gpg --armor --recipient test --encrypt hello
Dit commando versleutelt (`encrypts') de file hello met de publieke sleutel die test in z'n naam heeft, en plaatst het resultaat in de file hello.asc die in figuur 1 te vinden is. Het precieze resultaat hangt natuurlijk wel van je sleutels af! Als je de optie --armor weglaat komt er overigens een ander formaat uit dat niet leesbaar is als gewone tekst maar verder eender werkt.

-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

hQEOA4BeVDGD66xsEAP/QdY3SLrJKFbl7BdiSbjvlrdVF6giHfzD93cv2/SZZIaZ
dFaTp0TqvDUM+fOYWNRYZET5WfvnZguhmLLb1NLV6v7F1u1i34Xk9jDBhviIYnoc
3nKA0MKL/C73HHkcYcDt98WFhEDMQzxZkeRoEl1fQs+KcTZWPyf5OEfY6cwfScED
/RLNt/XoY6DKhON1LOQzbM5ZbSIVcXW6zFbEELvZH7DMCy7Ezkj8v6+GU+JNQAEX
qUhlT08oNDm7+R7GsZEjWccLUuIswTjOseB6iPfxQPBRAO6gvZuxfCuTqkpyK/Yt
6bXb55opBfDuq0fIEzvaHQ0BQg2sFQ8mJnFEOb4bO7IN0ksBLeCWZE2GtpIMUaNf
Ze9HfnNDK2zgjAlVRbSnXKLM68PTVGbiIDugMXSEwbMnTVqvLQMxZkXRzLn0lVny
eN1MVt6U7OCfVxHI6os=
=s59m
-----END PGP MESSAGE-----
Figuur 1: De tekst "Hello world!" na encryptie.

Je herkent de OpenPGP-notatie aan de eerste en laatste regel, en ook een stuk software kan daarmee uit de voeten. Want geloof het of niet, dit rotzooitje is te decoderen! Daarvoor moet je dan wel je geheime sleutel gebruiken natuurlijk, want deze boodschap is versleuteld `for your eyes only'. En als je bij je geheime sleutel wilt... heb je je password nodig! Doe maar eens

gpg --decrypt hello.asc
Dan moet je je password intikken maar hij geeft dan wel prompt de originele tekst weer! De truc is echter dat dat niet kon zonder je geheime sleutel, dus anderen kunnen dat niet doen. En hoewel de geheime en publieke sleutel elkaars omgekeerden zijn, is het verband ertussen zo gruwelijk ingewikkeld, dat algemeen geloofd wordt dat het veilig is je publieke sleutel algemeen beschikbaar kunt stellen aan iedereen. Handig, want dan kan iedereen jou versleutelde email sturen die jij alleen kunt lezen!

Key servers

Om je sleutel te publiceren is er een wereldomspannend netwerk van `key servers' waar je het heen kunt zenden. Als je straks een betere sleutel hebt dan deze speel- en testsleutel kun je die als volgt uploaden:

gpg --keyserver wwwkeys.nl.pgp.net --send-keys C13A8B01
Deze keyserver is handig dichtbij voor Nederlanders, en hij wordt wereldwijd gesynchroniseerd. De code op het eind is je key-id, ofwel de onderste 32 bits van je fingerprint. Een Amerikaan kan dus, als hij je privé email wil zenden, jouw publieke sleutel ophalen met het commando
gpg --keyserver wwwkeys.us.pgp.net --recv-keys C13A8B01
De code is de "ID" van jouw sleutel, en die kan de Amerikaan kennen wanneer hij email van je krijgt. Overigens kan GnuPG dit ophalen van onbekende sleutels ook automatisch doen als hij iets wil natrekken.

Natuurlijk kun je je certificaten ook anderszins publiceren; ik heb ze bijvoorbeeld op een webpagina staan, op http://rick.vanrein.org/cert, waar iedereen die dat wil ze kan ophalen. Ook de keyservers draaien vaak een web-interface, zodat je niet alle vormen van gebruik van gpg hoeft te weten.

Een mooie eigenschap van de key servers is verder dat ze informatie samenvoegen, dus als je later je keys nogmaals uploadet, mogelijk nadat ze zijn uitgebreid met nieuwe informatie, dan gaat dat gewoon goed.

Rampenplan

De geheime sleutel moet alleen voor jou beschikbaar zijn, wees dus voorzichtig met de opslag ervan en met het password dat er op zit. Kies ook een moeilijk te raden password, en niet gewoon de naam van je man of vrouw. Er zijn twee dingen die fout kunnen gaan: jouw geheime sleutel komt in andermans handen (en daarmee dus alle geheimen die ermee te decoderen zijn) of jij verliest toegang tot je geheime sleutel (en dus ook tot al je versleutelde berichten). Beide gevallen kunnen rampzalig zijn, en het is in zo'n geval nuttig om een sleutel onmiddelijk terug te trekken, zodat anderen hem niet meer gebruiken. Daarvoor moet je nu al, nu je net een sleutelpaar hebt gemaakt, een "terugtrekcertificaat" aanmaken. Het is handig dat nu al te doen, omdat je nu je password nog weet! Dat doe je met

gpg --output revoke-test.asc --gen-revoke test
Het certificaat in revoke-test.asc kun je publiceren wanneer het nodig is; het is al ondertekend met de teruggetrokken geheime sleutel (daarom moest je je password ingeven) en als reden moet je aangeven waarom je certificaat ooit zou willen terugtrekken. Overigens staat "key compromise" voor het in handen van anderen komen van je geheime sleutel. Als je het geval wilt ondervangen waarin je je sleutel (of het password ertoe) kwijtraakt is "key is no longer used" vermoedelijk de beste optie.

Zorg dat niemand zomaar bij dit certificaat kan; iemand anders kan dit certificaat namelijk ook gebruiken om je geheime sleutel uit de roulatie te halen!

Handtekeningen

Het is met OpenPGP mogelijk, en voor email ook gebruikelijk, om je data te ondertekenen, zodat onomstotelijk vast te stellen is dat die van jou afkomstig is. Dat is prettig omdat de andere kant dan weet dat niet iemand anders zich als jou voordoet, en bovendien wordt het hiermee mogelijk om te controleren dat er niets aan gewijzigd is door Kwade Lieden.

Dat doe je bijvoorbeeld met

gpg --armor --clearsign hello
Ondertekening werkt, technisch gezien, door eerst je document "in te dikken" tot een korte code (een zogenaamde message digest, met MD5 en SHA1 als bekendste voorbeelden), en die code vervolgens te encrypten met je geheime sleutel. Dat wordt vervolgens aan de boodschap toegevoegd, en levert iets als in figuur 2. De ontvanger kan nu enerzijds diezelfde indikking berekenen, anderzijds kan hij de encrypted versie decrypten met je publieke sleutel; als dat beide hetzelfde levert, dan weet de ontvanger dat er niets aan de boodschap veranderd is, en dat hij van jou afkomstig is (want niemand anders kan jouw handtekening immiteren, je geheime sleutel was er immers voor nodig).

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hello world!
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQE7PcJ/ZMMFEVnVu4IRAhxxAKChpZ2EP3EzbteHIIdBhhjYMO4/awCeKOo5
+u7410CwlHi47uE09tnFxzM=
=OYby
-----END PGP SIGNATURE-----
Figuur 2: De tekst "Hello world!" na cleartext-ondertekening.

Een nuttige toepassing van ondertekening die je weleens op download-sites ziet, is de ondertekening van de downloadbare code. Bijvoorbeeld op http://www.kernel.org/pub/linux/kernel/v2.4/ vind je kernels met daarnaast losse files met ondertekening. Die zijn gemaakt als losse handtekening, ontkoppeld van het document, en je kunt het gebruiken om, na downloaden van kernel en signature, de afkomst te controleren:

gpg --keyserver wwwkeys.nl.pgp.net --verify linux.tar.bz2.sign linux.tar.bz2
Als het goed is, is dit een "Good signature" afkomstig van ftpadmin@kernel.org. Als je de kernel van een mirror hebt gedownloadet, kun je controleren of het inderdaad de authentieke code is, en niet bijvoorbeeld een in Redmond geregisseerde boycot. Wil je zelf zo'n signature genereren, gebruik dan de optie --detach-sign in plaats van --clear-sign.

Vertrouwen in een sleutel

Als het goed is, was de handtekening over de kernel juist, maar kon de ondertekenaar niet worden gevonden, en kreeg je de boodschap

No path leading to one of our keys found.
Wat hier eigenlijk staat, is dat iedere Jan Doedel wel een sleutel kan aanmaken op naam van ftpadmin@kernel.org, en dat het nog maar de vraag is of dit de juiste is. Je krijgt ook een vrijwel-unieke code voor deze sleutel te zien, namelijk de zogenaamde fingerprint:
C75D C40A 11D7 AF88 9981  ED5B C86B A06A 517D 0F0E
Net als vingerafdrukken is de kans dat twee mensen dezelfde hebben verwaarloosbaar klein, hoewel het niet geheel uit te sluiten valt. Een fingerprint geeft eigenlijk heel kort aan wat je sleutelpaar is, maar wel zonder dat je geheime sleutel afleidbaar is.

Het is een zeer slimme vondst om met vrijwel unieke vingerafdrukken te werken. Dat betekent namelijk dat nergens een centrale database nodig is die een unieke verzekeren kan, en dat is prettig want dat zou een zwakke schakel in het OpenPGP idee zijn. De hashing technieken die ten grondslag liggen aan de vingerafdrukken in OpenPGP maken het zeer onwaarschijnlijk dat twee personen dezelfde vingerafdruk krijgen, en aangezien de codes alleen worden gebruikt om te controleren of een persoon is wie hij zegt dat het is (en niet, bijvoorbeeld, om hem op te zoeken) is dat ruimschoots voldoende. De term vingerafdruk is dan ook zeer goed gekozen -- ook Moeder Natuur houdt geen database met vingerafdrukken bij maar komt in de praktijk vrijwel altijd met wat nieuws op de proppen!

Het is de bedoeling dat je de vingerafdruk controleert voordat deze sleutel vertrouwd kan worden. Dat doe je door een ander, betrouwbaar kanaal na te trekken. Voor dit exemplaar moet je Linus even bellen, of je moet het nakijken op de kernel website, http://www.kernel.org/signature.html. Kijk de fingerprint-code zorgvuldig na; pas als je helemaal zeker bent dat hij klopt ga je door. Als je op meerdere manieren een vingerafdruk kunt controleren moet je dat zeker doen. Er is zelfs een almanak te koop met de belangrijkste OpenPGP vingerafdrukken over de hele wereld!

Als je deze vrijwel-unieke code van de sleutel correct hebt bevonden kun je hem voortaan vertrouwen. Merk op dat (automatisch) geïmporteerde sleutels dus zonder tegenbericht gewantrouwd worden. Je moet de volgende actie ondernemen om daar een einde aan te maken:

gpg --sign-key ftpadmin@kernel.org
Als je nu nogmaals de kernel verifieert dan zie je dat het vertrouwen in de sleutel nu wel aanwezig is.

Web of Trust

Het mooiste concept dat PGP heeft te bieden is eigenlijk het Web of Trust. Dat is een middel om het zojuist getoonde ondertekenen van sleutels te vergemakkelijken. Stel dat jij iemand kent waarvan je weet dat die het controleren van de fingerprints altijd netjes doet, en waarvan je weet dat hij zich niet met louche zaakjes inlaat, dan kun je eigenlijk best hetgeen vertrouwen dat hij vertrouwt. Dat is het idee achter het Web of Trust.

Om dit te bereiken roep je de "key editor" aan met

gpg --edit-key some@one.dom
en daarbinnen geef je het commando trust om uit te drukken hoeveel vertrouwen je in de fingerprint-controle door de persoon achter some@one.dom hebt. Geef aan dat je "marginal trust" hebt als iemand maar zo-zo checkt, of geef aan dat je iemand "fully trust" als die persoon net zo goed checkt als jij.

Wanneer een OpenPGP programma zoals GnuPG zich afvraagt of iemand's handtekening te vertrouwen is, dan zoekt hij deze informatie op, beginnend met jouw opzet. Daarbij is het wel nuttig als je in de configuratiefile (voor GnuPG is dat ~/.gnupg/options) een keyserver aangeeft. Als er binnen jouw kennissenkring voldoende vertrouwen in een sleutel is, dan vertrouwt jouw systeem die sleutel ook. Natuurlijk gaat dit er wel van uit dat jouw kennissenkring hun ondertekeningen van andermans sleutels ook uploaden in de key servers.

Tool support

Tot hier toe hebben we vooral tekst-utilities bekeken, en dat was nuttig om te zien hoe het allemaal onder water werkt. Maar in de dagelijkse praktijk is het heel wat prettiger om een tool te gebruiken die PGP support ingebouwd heeft. Helaas is de integratie in mailtools nog niet zo best; ik ken alleen een halfwas integratie in elm, de tamelijk onbekende mailtool tkrat, en op kmail liep ik stuk bij gebrek aan goede documentatie. Maar omdat de export-restricties op sterke cryptografische technieken uit de US opgeheven is, zal dit vermoedelijk steeds beter worden; het is niet langer meer nodig om wetten te omzeilen door code op T-shirts te printen en in die vorm te exporteren, zoals vroeger met PGP wel is gedaan.

Compatibility tussen GnuPG en het originele PGP is prima. Alleen de oude versies PGP 2.x gebruikten IDEA sleutels, en die zijn niet "vrij" (in de zin van "vrije software") en worden daarom ook niet in GnuPG ondersteund. Maar tegenwoordig gebruikt vrijwel iedereen PGP 5.x geloof ik, dus dat zal niet zo'n probleem geven.

Verder zijn er grafische lagen om GnuPG (en om PGP) in de maak; dit alles is te vinden vanuit de GnuPG site, op http://www.gnupg.org.

Conclusie

Wanneer je het onprettig vindt wanneer anderen mee kunnen lezen in jouw documenten, dan heb je met OpenPGP een goede, open standaard, en met GnuPG een keurige implementatie van die standaard. De key servers maken alle informatie, inclusief het Web of Trust, toegankelijk voor iedereen, en de (langzaam) vorderende integratie in tools zorgt er voor dat je geen reden tot angst voor luistervinken meer hoeft te hebben!


 
   ------ 8< ---------- 8< ----------- 8< ------ | OpenFortress*