Spring naar hoofdtekst

Handmatige PGP-WKD met Python

Geplaatst op door ,
Laatste aanpassing op .

Inleiding

Door een nieuwsbericht op één van mijn favoriete tech-sites werd ik er op gewezen dat de sleutelpraktijken van PGP communicatie niet echt meer werkbaar zijn. Grof gezegd ligt het systeem op z'n gat door een recente aanval. De communicatie op zich is hartstikke veilig, maar het overdragen van de sleutels is een puinhoop en niet bepaald gebruiksvriendelijk.

Gelukkig is er met keys.openpgp.org een alternatief, maar hier gaat een deel van het oude PGP, het zogenaamde Web of Trust verloren. Mijn persoonlijke PGP-sleutel heb ik desondanks aangemeld en geverifiëerd.

Web Key Directory

In één van de commentaren op het nieuwsbericht werd gesproken over een mogelijke aanvulling op de ouderwetse PGP-sleuteloverdracht: WKD oftewel Web Key Directory. Dat is een methode om via HTTPS een sleutel automatisch op te halen op basis van een e-mailadres (zie ook link 1, link 2 en link 3).

Het adres wordt gesplitst in een lokaal deel (vóór het @-teken) en de hostnaam. Daarna wordt het lokale deel in drie stappen omgetoverd tot een goed lees- en uitspreekbare tekenreeks. Ten eerste worden alle hoofdletters vervangen door kleine letters. Dan wordt de tekst met SHA1 gehasht. Tot slot wordt dit met zbase32 gecodeerd tot een reeks van 32 letters en cijfers.

E-mailprogramma's zoals Thunderbird met Enigmail kunnen daarna vanaf het eerste bericht versleuteld mailen met de ontvanger. Ze halen op de achtergrond de sleutel op, als die kan worden gevonden op de webserver achter het @-teken. Voor info@fwiep.nl luidt de betreffende URL bijvoorbeeld:

https://fwiep.nl/.well-known/openpgpkey/hu/mg6owx9w8c3ejg3tu31f4tha5n17d4rj

Z-base32

Eerder werkte ik al met de base64-codering, waarin met 64 leesbare tekens om het even welke binaire data kan worden overgedragen. Dat er ook een 32-tekens variant van zou bestaan, verbaasde me niet. Maar van z-base32 had ik nog nooit gehoord. Het is een codering die geoptimaliseerd is om door mensen te worden gelezen, bewerkt en doorgegeven.

In eerste instantie vond ik op GitHub een project dat precies bood wat ik zocht, maar ik snapte niets van de Go-programmeertaal en hoe ik de code moest aanspreken of compileren tot een functionerend iets. Er was zelfs een pakket in de Ubuntu repositories met deze inhoud - maar ook hier zonder documentatie of hint van zijn toepassing.

Toen vond ik in de README van bovengenoemd project de stelling dat het volledig compatibel wilde zijn met de Python-module zbase32. Ook hier ontbrak, voor zover ik kon zien, documentatie of voorbeeldcode om met het project aan de slag te gaan.

Eerste keer Python

Ik besloot om dit als positieve ontwikkeling te zien en vervolgens met Python te gaan stoeien - een programmeertaal waar ik veel over las, maar bijna geen praktijkervaring mee had. Een eerste import zbase32 was snel geregeld. Met import inspect en de bijbehorende documentatie kwam ik de functies van zbase32 langzaam op het spoor:

>>> import inspect, zbase32
>>> inspect.getmembers(zbase32, inspect.isfunction)

Ik vond de zbase32.b2a() functie om binaire data naar een tekenreeks te coderen. Samen met hashlib.sha1() en wat huishoudelijke code daar omheen kon ik uiteindelijk onderstaand script schrijven:

#!/usr/bin/env python
#
# Transforms an emailaddress (first commandline argument) to a valid
# PGP-WKD URL. See https://keyserver.mattrude.com/guides/web-key-directory/
# for details.
# 
import sys
import hashlib
import zbase32

def main(argv):
    if len (argv) != 2:
        print "Error: this script expects one single parameter."
        sys.exit (1)

    parts = argv[1].lower().split("@")
    if len(parts) != 2:
        print "Provided string is not a valid email address!"
        sys.exit(2)

    scheme = "https://"
    path = "/.well-known/openpgpkey/hu/"
    print scheme + parts[1] + path + zbase32.b2a(hashlib.sha1(parts[0]).digest())

if __name__ == "__main__":
    main(sys.argv)

Epiloog

Uiteindelijk kon ik dus van mijn eigen e-mailadressen de bijpassende URL genereren om te gebruiken met WKD via HTTPS. Pas later ontdekte ik op de verschillende sites een verwijzing naar de gpg-optie --with-wkd-hash. Hiermee krijg je de zbase32-hash vanzelf getoond bij het betreffende e-mailadres. D'oh!

Inhoudsopgave

Atom-feed Atom-feed van FWiePs weblog

Artikelen


Doorzoek de onderstaande categorieën om de lijst met artikelen te filteren.