tas2580
Blog über Webentwicklung

PGP Verschlüsselung mit PHP

tas2580  

Nach Snowden macht sich jetzt doch der ein oder andere Gedanken über E-Mail Verschlüsselung, ich verwende dazu schon länger PGP, nicht weil ich schon immer wusste das die NSA uns alle abhört sondern eher weil es da ist und ich gerne Sachen ausprobiere. Damit war ich lange Zeit alleine, da es den meisten in meinem Bekanntenkreis zu kompliziert ist PGP zu installieren, oder sie einfach zu faul sind sich damit zu beschäftigen. Seit Snowden hat sich das zwar ein bisschen gebessert und ich habe heute eine Hand voll Leute in meiner Kontaktliste die PGP verschlüsseln. Wenn ich aber so in meinen Posteingang schaue muss ich feststellen das die meisten Mails die ich bekomme nicht von meinen Bekannten kommen sondern automatisch generierte Mails von irgend welchen Webseiten bei denen ich mich mal angemeldet habe sind. Hier wäre es doch schön wenn diese Mails verschlüsselt wären, nicht weil da super Geheime Dinge drin stehen die bloß keiner lesen darf, sondern einfach um den Anteil verschlüsselter Mails zu erhöhen und damit der NSA das Leben schwer zu machen. Bei Mails die mir neue Passwörter zusenden wäre es dann sogar wirklich sinnvoll wenn die nicht in Klartext über das Netz gingen.


Da ich ja selber immer wieder Webseiten baue die auch E-Mails versenden dachte ich mir das ich einfach mal versuche das in Zukunft wenn möglich einzubauen. Dazu lasse ich die User neben ihrer E-Mail Adresse einfach ihren Public Key angeben. So schwer kann das ja nicht sein. Wie sich rausgestellt hat ist das auch gar nicht so kompliziert da PHP dafür ein Modul bereit stellt. Standardmäßig ist das allerdings nicht installiert, lässt sich aber mit pecl install gnupg ganz einfach nachinstallieren. Nach der Installation muss man in die php.ini noch extension=gnupg.so einfügen und den Webserver neustarten.

Danach kann man in PHP ganz einfach Texte verschlüsseln, ich habe dazu mal eine kleine Funktion geschrieben:

function pgp_encrypt($message$pubkey)
{
    if(
function_exists('gnupg_init') && !empty($pubkey))
    {
        
putenv("GNUPGHOME=/tmp");
        
$res gnupg_init();
        
$rtv gnupg_import($res$pubkey);
        
$rtv gnupg_addencryptkey($res$rtv['fingerprint']);
        return 
gnupg_encrypt($res$message);
    }
    return 
$message;
}

Die Funktion verschlüsselt den in $messsage angegebenen Text mit dem in $pubkey angegebenen PGP Public Key und gibt die Verschlüsselte Nachricht zurück die man entweder direkt so mailen kann (inline PGP) oder wenn man es schön machen möchte als Dateianhang an die Mail anhängt.

Das verschlüsseln ist etwas Serverlastig, für Newsletter die an viele Benutzer gehen also nicht unbedingt geeignet, wobei ich das bis jetzt auch nur auf einem Raspberry PI getestet habe, richtige Server verschlüsseln mit Sicherheit deutlich schneller.

Key vom Keysefver holen

Der Nachteil ist das wenn der Benutzer seinen Public Key angeben muss er mit Sicherheit vergisst bei einer Änderung des Keys den Key auf der Webseite zu aktualisieren. Aus diesem Grund ist es Sinnvoll den Key von einem Keyserver zu holen. So muss der User nicht extra seinen Key raus suchen und man hat immer den aktuellen Key, vorausgesetzt der User benachrichtigt einen Keyserver über seine Keyänderungen. Auch das geht recht einfach, sollte allerdings nicht jedes mal wenn eine Mail versendet wird gemacht werden da das abfragen des Keys wieder einige Zeit dauert und so das versenden der Mails sehr langsam wird. Man kann den Key aber in einer Datenbank zwischenspeichern und nur alle paar Tage oder Wochen nachschauen ob er sich geändert hat. Welchen Keyserver man abfragt ist eigentlich egal da die sich gegenseitig über Änderungen informieren, man muss also nicht zwingend den Server fragen bei dem der User seinen Key hinterlegt hat. Am besten benutzt man einen Keyserver der ohne Captcha die Keys ausspuckt.

file_get_contents('http://pool.sks-keyservers.net/pks/lookup?search=' urlencode($email) . '&op=get&fingerprint=on');


Ähnliche Beiträge


Kommentare


Bitte warten ...

Kommentar schreiben

URLs werden automatisch umgewandelt.
[b]DEIN TEXT[/b] für Fett gedruckt
[quote]DEIN ZITAT[/quote] für Zitate
[code]DEIN CODE[/code] für Code
captcha