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://www.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!