PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘Verschlüsselung’ tag

TLS 1.0/1.1 Abschaltung: Eigene Versionsverteilung herausfinden und serverseitig abschalten

without comments

Browserhersteller planen, ab 2020 die TLS-Versionen 1.0 und 1.1 nicht mehr zu unterstützen:

https://www.heise.de/security/meldung/Verschluesselung-im-Web-Chrome-Firefox-Co-verabschieden-sich-von-TLS-1-0-1-1-4191864.html
https://www.golem.de/news/https-browser-wollen-alte-tls-versionen-2020-abschalten-1810-137135.html

Mit den richtigen Einstellungen und Ciphers ist TLS 1.0 noch sicher zu betreiben, aber man muss es eben richtig konfigurieren, wenn man alles beachten will: BEAST, POODLE, Sloth, DROWN, CRIME und BREACH, RC4, MD5, ROBOT, Sweet32, Bleichenbacher, Heartbleed, FREAK und Logjam, …

Da es schon ein Dutzend Probleme gab in den letzten Jahren, möchte man sich des Problems lieber früher als später entledigen, gern bevor es zum großen Knall kommt. TLS 1.2 ist nicht gegen all diese Probleme gewappnet, man muss nach wie vor aufpassen wie man die Ciphers konfiguriert. Aber man kann weniger Fehler machen. Und das Ziel ist es, TLS 1.3 zu nutzen, wo all dieses Probleme gelöst sind, da alles unsichere radikal entfernt wurde, und nicht mehr 100 Ciphers zur Auswahl stehen, sondern nur noch eine Handvoll. Weniger Auswahl ist eben manchmal besser.

Ich schrieb 2014 über die Abschaltung von SSLv3, und im Dezember 2017 darüber, dass ab dem 30. Juni 2018 im Kreditkarten-/Payment-Bereich TLS 1.2 als Minimum genutzt werden muss.

Weiterlesen »

Written by Michael Kliewe

Oktober 17th, 2018 at 7:06 pm

PGP und GPG: Wie arbeite ich mit asynchroner Verschlüsselung

with 4 comments

PGP und GPG sollte den meisten ein Begriff sein, auch wenn es selbst noch nie oder nur sehr selten eingesetzt wird. Die wenigsten nutzen es wahrscheinlich täglich und beispielsweise mit allen E-Mail-Adressen.

Einen Rundumschlag bezüglich asynchroner Verschlüsselung und PGP/GPG mit PHP habe ich für das PHP Magazin geschrieben. In der Ausgabe 1.12 erkläre ich darin das Grundkonzept von asynchroner Verschlüsselung und der Nutzung von GPG aus PHP heraus, zum Beispiel zum Versenden von signierten und/oder verschlüsselten E-Mails. Seit vorgestern gibt es den Artikel auch kostenlos Online. Ich zeige wie man Dateien und Texte verschlüsseln, signieren, entschlüsseln und Signaturen prüfen kann. Am Ende verweise ich auf eine kleine GPG-Test-Webseite, auf der man etwas mit GPG rumspielen kann. Außerdem habe ich einen kleinen GPG-E-Mail-Bot gebastelt der auf eingehende E-Mails reagiert und mit dem man seine E-Mail-Verschlüsselung testen kann. Alle weiteren Details befinden sich auf der angesprochenen Webseite.

Weiterlesen »

Written by Michael Kliewe

Januar 26th, 2012 at 9:36 am

Posted in PHP

Tagged with , , , ,

TLS/SSL für Heimwerker

with 5 comments

Gastartikel von Oliver Sperke.

Ich bin 34 Jahre alt und seit 10 Jahren selbständiger Webentwickler. Mein Fokus liegt dabei auf der Erstellung, Beratung und Optimierung in den Bereichen High Performance, Usability und Sicherheit in den gängigsten Internetsprachen: PHP, HTML, Javascript und CSS.

In den vorhergehenden Beiträgen habe ich ja schon locker über Passwörter und wie man mit Ihnen umgehen sollte erzählt. Dabei wurde auch immer wieder mal angemerkt, dass meistens nicht der Login, sondern die Übertragung dieser Daten das eigentliche Problem wäre. „Man in the middle“, „Sniffer“ und der ganze … Mist. Das beste Mittel gegen viele Sicherheitsprobleme ist sicher SSL oder neu TLS, nur leider ist das für manche Webmaster immer noch nicht einsetzbar. Warum weiß ich persönlich nicht, denn eine zusätzliche IP, die evtl. benötigt wird, liegt bei etwa 1 Euro/Monat und einfache Shared Zertifikate, die meistens vollkommen ausreichen gibt es kostenlos.

Wer aus welchen Gründen auch immer kein TLS einsetzen kann oder will, sollte sich mit anderen Mitteln helfen. Das Ziel muss sein, alle wirklich sensiblen Daten (E-Mail, Passwörter, etc) so zu übertragen, dass sie auf dem Transport nicht gelesen werden können. Das ist schwierig, denn spätestens unser Server sollte es lesen können. Eine Idee ist, die Passwörter mit Einweghashes zu bearbeiten. Da unsere Passwörter aber natürlich sicher verstaut sind, können wir mit dem ankommendem Passwort nichts anfangen. Selbst wenn wir diesen Mechanismus in Javascript komplett nachbauen, wie kriegen wir den geheimen systemweiten Salt rein? Ausserdem gäben wir einem potentiellem „schlimmen Finger“ wichtige Informationen, was im Jahr 2011 keine gute Idee ist. Eine symmetrische Verschlüsselung kommt ebenfalls nicht in Frage, weil wir müssten mindestens einmal den Schlüssel übertragen, was das Verfahren überflüssig macht.

Die einzige sichere Möglichkeit ist das Verfahren, dass auch TLS benutzt. Asymmetrische Verschlüsselung! Da uns per Aufgabenstellung kein TLS zur Verfügung steht, ist unser Ziel, dieses Verfahren möglichst sicher zu kopieren – TLS für Heimwerker. Auch dieses Verfahren ist nicht ganz einfach, denn man muss zusätzliche Software installieren (können). Ich versuche den Aufwand und die Erklärungen aber so einfach wie möglich zu halten. Ein wirklicher Vorteil: Einmal eingerichtet ist es auf unbegrenzt viele Domains auf einem Server anwendbar, völlig unabhängig von der IP. Ein Anwendungszweck, der mir spontan einfällt sind Blog- oder Forenanbieter, wo die Anschaffung von Wildcardzertifikaten zu teuer wäre.

Weiterlesen »

Written by Oliver

Juli 25th, 2011 at 9:41 am

Posted in Javascript,PHP

Tagged with , , ,

Applikationslogin mittels SSL-Zertifikat

with 6 comments

Passworte haben Nachteile, das wissen wir alle. Sie müssen genügend komplex aber trotzdem merkbar sein, die Länge und Art der Zeichen sind dafür verantwortlich wie einfach es zu erraten ist. Fast niemand verwendet Passworte mit mehr als 8 oder 10 Zeichen. Ohne wirksame Brute-Force-Gegenmaßnahmen sind diese innerhalb von Stunden oder wenigen Tagen knackbar. Auch ein Einbruch in den Webserver liefert dem Angreifer heutzutage häufig den Hash des Passwortes (häufig MD5).

SSL bzw. Public/Private-Key Verfahren zeigen sichere Alternativen. Diese sind häufig sehr lang (>1024 bit) und dadurch nicht mehr erratbar. Außerdem ist es möglich den Public-Key ohne Bedenken herauszugeben, daraus den Private-Key zu errechnen wird auf lange Zeit nicht möglich sein. Das ist zwar auch bei Passworten möglich (md5, sha1 etc), aber diese Hashes sind kürzer und in der Vergangenheit regelmäßig geknackt worden. Erhältliche Rainboxtables und Wörterbuch-Angriffe machen die Rückführung auf das Originalpasswort sehr einfach.

Wie wäre es also, zum Beispiel den Admin-Bereich einer Applikation nicht mittels Username+Passwort zu schützen, sondern mit einem OpenSSL-Keypaar? Dann braucht man sich keine Sorgen über Brute-Force-Angriffe machen.

Eine weitere schöne Anwendungsmöglichkeit ist, wenn sich die Administratoren als einer ihrer User einloggen können möchten. Da man ja die Passworte seiner User nicht kennt muss man das anders lösen.

Weiterlesen »

Written by Michael Kliewe

Mai 14th, 2010 at 12:35 pm

Daten verschlüsselt übertragen mit PHP und SSH

with one comment

Kann man mit PHP Daten oder Dateien zwischen 2 Rechnern verschlüsselt übertragen? Natürlich kann man, wenn die Gegenstelle es auch beherrscht.

Hier soll es weder um eine Verschlüsselung zwischen Browser und Webserver (HTTPS) noch um die verschlüsselte Kommunikation zu einem Mailserver (IMAPS oder POPS) oder einem FTP (FTPS) gehen, sondern um eine Verschlüsselung zwischen 2 Rechnern mittels SSH. Wir wollen nicht eine Datei verschlüsseln (es gibt ja diverse Algorithmen dafür, angefangen bei zip+passwort, mcrypt, pgp/gpg, AES etc) und sie dann unverschlüsselt übertragen, sondern stattdessen die Verbindung ansich verschlüsseln und dann darin „unverschlüsselt“ kommunizieren.

Mit Linux-Systemen hat man am wenigsten Probleme, denn dort ist ein SSH-Server standardmäßig mit installiert und gestartet. Unter Windows muß man Software nachinstallieren, beispielsweise freeSSHd oder sshwindows. Ich muss allerdings zugeben, dass ich bisher nur mit Linux-Rechnern gearbeitet habe. Dies betrifft natürlich nur die Gegenstelle. Auf dem Rechner wo PHP läuft braucht man keinen solchen Dienst.

Damit PHP mittels SSH kommunizieren kann, muß die ssh2-extention aus der PECL geladen werden. Einfach in das php/ext Verzeichnis entpacken und dann in der php.ini laden:

extension=php_ssh2.dll|so

Eine Verbindung aufzubauen ist recht einfach. Entweder macht man das via Username+Password, oder via Key.

$connection = @ssh2_connect($host, $port);
if (!$connection)
	throw new Exception("Could not connect to ".$host." on port ".$port);

$auth_methods = ssh2_auth_none($connection, $username);
if (in_array('password', $auth_methods)) {
    if (! @ssh2_auth_password($connection, $username, $password)) {
        throw new Exception("Could not authenticate with username $username and password $password.");
    }
} elseif (in_array('publickey', $auth_methods)) {
	if (!ssh2_auth_pubkey_file($connection, 'root',
				'/path/to/ssh_keys/id_rsa.pub',
				'/path/to/ssh_keys/id_rsa', 'keypassword')) {
			throw new Exception("Could not authenticate with username $username and private key");
	}
}
else {
	throw new Exception("cannot authenticate because password and privatekey are not allowed");
}

Wenn die Verbindung aufgebaut ist und der Login funktioniert hat, hat man mehrere Möglichkeiten:

  • Man möchte nur den anderen Rechner steuern mittels SSH. Dann nutzt man ssh2_exec()
    $stream = ssh2_exec($connection, 'whoami');
  • Man möchte Dateien zwischen den beiden Rechnern austauschen. Dazu kann man via sftp oder scp eine weitere Verbindung innerhalb der SSH-Verbindung aufbauen und mit Hilfe der SSH-Wrapper einfach die copy()-Funktion nutzen.
    $sftp = @ssh2_sftp($connection);
    if (!$sftp) {
    	throw new Exception("Could not initialize SFTP subsystem.");
    }
    
    $localPath = "/home/test/testfile.txt";
    $dir = "/home/target/";
    $remoteFilename = "testtargetfile.txt";
    $fullRemotePath = "ssh2.sftp://".$sftp.$dir.$remoteFilename;
    
    if (!file_exists($fullRemotePath)) {
    	$result = @copy($localPath, $fullRemotePath);
    
    	if ($result === false) {
            throw new Exception("Could not upload data file to: ".$dir." $remoteFilename");
    	}
    } else {
    	throw new Exception("File already exists, will not overwrite: ".$dir." $remoteFilename");
    }

Wie man in der Wrapper-Übersicht sehen kann, ist sftp auf jeden Fall vorzuziehen, damit kann man alles tun: Dateien lesen, schreiben, löschen usw.

Probiert es einfach mal aus, zum Beispiel um euch regelmäßig Dateien zuhause auf dem Homeserver abzulegen, oder auf den Root-Server eines Bekannten Backups zu kopieren (vorher komprimieren macht Sinn), um Daten auf seine Server im Cluster zu verteilen oder oder oder. Spätestens wenn man über unsichere Netzwerke wie das Internet kommuniziert, sollte man über Verschlüsselung nachdenken.

Hier gibt es noch Information rund um PHP und verfügbare Wrapper.

Written by Michael Kliewe

August 13th, 2009 at 7:02 pm

Posted in PHP

Tagged with , ,