Verhinderung von Identitätsdiebstählen durch die Erweiterung von PHP um Argon2d

Durch die Erweiterung von PHP um Argon2d können Nutzer und Dienstanbieter nun noch besser aktiv und präventiv vor Identitätsdiebstählen im Internet geschützt werden. Lesen Sie in diesem Blogartikel mehr über die Umsetzung sowie die Gefahren von Identitätsdiebstählen und erfahren Sie, wie Sie sich und Ihre Nutzer davor schützen können.

Lesezeit:
11 min
Verhinderung von Identitätsdiebstählen durch die Erweiterung von PHP um Argon2d

Mit Blick auf die digitale Landschaft wird deutlich, dass Identitätsdiebstähle längst keine abstrakte Bedrohung mehr darstellen. Laut einer Studie aus dem Jahr 2016 sind bereits 33% der befragten Deutschen mindestens einmal Opfer eines Identitätsdiebstahls geworden. Die Folgen können sowohl für Nutzer als auch für Dienstanbieter erheblich sein. Nutzer können durch Identitätsdiebstähle unter anderem finanzielle oder emotionale Schäden erleiden, während Dienstanbieter mit finanziellen, rechtlichen und rufschädigenden Konsequenzen rechnen müssen. Beispielsweise erlitten in der oben genannten Studie 29% der betroffenen Nutzer einen finanziellen Schaden mit einer durchschnittlichen Schadenssumme von 1.366 Euro.

Angesichts der Tatsache, dass viele Nutzer ihre Zugangsdaten für verschiedene Dienste wiederverwenden, indem sie dieselbe E-Mail-Adresse und dasselbe Passwort nutzen, stellen Datenleaks eine ernstzunehmende Gefahr dar. Diese ermöglichen es Kriminellen, Identitätsdiebstähle zu begehen, und stellen somit eine Bedrohung für die Sicherheit von Nutzern und Dienstanbietern dar.

Verhinderung von Identitätsdiebstählen

Viele Identitätsdiebstähle können bereits im Vorfeld verhindert werden, indem Maßnahmen ergriffen werden, um Datenleaks zu verhindern. Allerdings können Datenleaks aufgrund von Software-Schwachstellen, Fehlkonfigurationen oder menschlichem Versagen nicht vollständig ausgeschlossen werden. Diese Tatsache wird durch regelmäßige Medienberichte über neue Datenleaks belegt. Insgesamt sind heute bereits mehrere Milliarden Zugangsdaten von Nutzern im Internet auffindbar.

Um Identitätsdiebstahl infolge von Datenleaks dennoch präventiv zu verhindern, müssen Dienstanbieter die Passwörter der Nutzer in einer sicheren Form speichern, so dass diese nicht mehr effizient daraus ermittelt werden können. Zu diesem Zweck werden die Passwörter der Nutzer mittels Passwort-Hashing in einer sicheren Form gespeichert. Stand der Technik beim Passwort-Hashing ist die Verwendung der speicherintensiven Hashfunktion Argon2, um Angriffe durch spezialisierte Hardware zu erschweren. Von den drei Varianten von Argon2 bietet Argon2d dabei den besten Schutz gegen diese Angriffe, solange keine Bedrohung durch Seitenkanalangriffe bestehen. Können diese nicht ausgeschlossen werden, sollte die Variante Argon2id für das Passwort-Hashing verwendet werden.

Da allerdings nicht davon ausgegangen werden kann, dass jeder Dienstanbieter die Zugangsdaten sicher speichert, fordern das BSI und das NIST als weitere Schutzmaßnahme, die Zugangsdaten aktiv auf eine Kompromittierung durch Datenleaks zu überprüfen. Hierfür kann zum Beispiel der Identeco Credential Check eingesetzt werden. Dieser verwendet Argon2d, um zu verhindern, dass Angreifer den Credential Check als Orakel missbrauchen können, um an Zugangsdaten aus gesammelten Datenleaks von Identeco zu gelangen. In diesem Fall wird Argon2d nicht zum Passwort-Hashing verwendet, so dass der Credential Check auch in Umgebungen durchgeführt werden kann, die durch Seitenkanalangriffe verwundbar sind.

Passwort-Hashing

Passwort-Hashing ist eine Methode, um Passwörter sicher zu speichern. Dazu werden Einwegfunktionen verwendet. Diese sind nicht umkehrbar. Ein Beispiel für solche Einwegfunktionen sind kryptografische Hashfunktionen wie SHA2. Beim Passwort-Hashing wird das Passwort selbst nicht direkt gespeichert. Stattdessen wird nur das eindeutige Ergebnis der Einwegfunktion gespeichert. Dies wird auch als Passwort-Hash bezeichnet.

Speicherintensive Hashfunktionen

Speicherintensive Hashfunktionen gehören zu den kryptographischen Hashfunktionen. Sie benötigen jedoch viel Arbeitsspeicher zur Berechnung des Hashes. Diese Eigenschaft sorgt dafür, dass Angreifer nicht mit Hilfe von spezialisierter Hardware wie GPUs, FPGAs und ASICs eine große Anzahl von Passwortkandidaten parallel ausprobieren können. Aus diesem Grund sind speicherintensive Hashfunktionen ideal zum Passwort-Hashing geeignet.

Allgemeine Informationen zu PHP

PHP ist eine Open-Source-Skriptsprache, die sich hervorragend für die Entwicklung von Webseiten eignet. Über 75% aller Webseiten verwenden PHP als serverseitige Programmiersprache. Das Content-Management-System (CMS) WordPress, das von über 40% aller Webseiten im Internet verwendet wird, trägt zu dieser hohen Verbreitung maßgeblich bei. Darüber hinaus basieren viele Shopsysteme wie Shopware oder Magento auf PHP, die zusammen einen Marktanteil von über 50% der Shopsysteme in Deutschland ausmachen.

Für zahlreiche CMS und Shopsysteme, die auf PHP basieren, können Plugins entwickelt werden. Diese Plugins können beispielsweise mithilfe des Identeco Credential Check die Zugangsdaten von Nutzern bei jeder Anmeldung in Echtzeit auf eine Kompromittierung durch Datenleaks überprüfen. Durch die Installation dieser Plugins können Dienstanbieter sich und ihre Nutzer auf einfache Weise aktiv vor Identitätsdiebstählen infolge von Datenleaks schützen.

Problematik beim Einsatz von Argon2d in PHP

Obwohl PHP von den meisten Webseiten als Programmiersprache verwendet wird, bietet es keine direkte Unterstützung für Argon2d, weder zum Passwort-Hashing noch zur Implementierung des Credential Checks für zum Beispiel CMS- und Shopsystem-Plugins. Seit PHP 7.2 werden die Varianten Argon2i und Argon2id von PHP zum Passwort-Hashing unterstützt. Derzeit gibt es nur zwei Ansätze zur Berechnung von Argon2d-Hashes in PHP.

Der erste Ansatz nutzt das Kommandozeilenprogramm argon2 zur Berechnung von Argon2d-Hashes, auf das in PHP über die system()-Methode zugegriffen werden kann. Nachfolgend ist eine Beispielfunktion für die Berechnung eines Argon2d-Hashes mit diesem Ansatz dargestellt:

public function argon2d_hash(String $input_data, String $salt):String
{
    return system("echo -n " . $input_data . " | argon2 " . $salt . " -d -r");
}

Diese Funktion berechnet zwar korrekte Argon2d-Hashes, sollte allerdings nicht verwendet werden, da sie verwundbar für “Command Injection”-Angriffe (CWE-77) ist. Dies liegt daran, dass Sonderzeichen in den übergebenen Eingaben nicht escaped werden. Sollte diese Funktion dennoch zum Passwort-Hashing oder für den Credential Check eingesetzt werden, kann dies zu schwerwiegenden Sicherheitsvorfällen führen. Ein Angreifer könnte durch eine geeignete Wahl des Passwortes oder des Nutzernamens über die öffentlich zugängliche Loginseite einen beliebigen Befehl auf dem Server ausführen.

Außerdem kann dieser Ansatz nicht immer für CMS- und Shopsystem-Plugins verwendet werden, um den Credential Check im Shared Hosting zu verwenden. Dies liegt daran, dass Kunden im Shared Hosting keine systemweiten Änderungen vornehmen können. Ist somit das Kommandozeilenprogramm argon2 nicht vorinstalliert oder die system()-Methode in der PHP-Installation gesperrt, kann in diesem Fall auch kein Plugin für den Credential Check zur aktiven Verhinderung von Identitätsdiebstählen eingesetzt werden.

Zudem existiert eine PHP Argon2 Erweiterung auf GitHub, die die Verwendung von Argon2d zum Passwort-Hashing ermöglicht. Bei diesem Ansatz kann der Salt allerdings nicht frei gewählt werden. Daher ist diese Erweiterung nicht für die Implementierung des Credential Checks geeignet, da dieser den Argon2d-Hash des Nutzernamens mit einem statischen Salt berechnet. Außerdem kann diese Erweiterung nur eingeschränkt eingesetzt werden, da sie die aktuellen PHP-Versionen 8.X nicht unterstützt.

Aus diesem Grund wurden die PHPArgon2d Erweiterung und die PlainPHPArgon2d Bibliothek entwickelt. Diese ermöglichen eine benutzerfreundliche Verwendung von Argon2d in PHP sowohl für das Passwort-Hashing als auch für den Credential Check.

Technische Umsetzung

Im Folgenden wird die technische Umsetzung der PHPArgon2d Erweiterung und der PlainPHPArgon2d Bibliothek beschrieben. Dabei wird insbesondere auf Besonderheiten und aufgetretene Probleme eingegangen.

Umsetzung der PHPArgon2d Erweiterung

Die PHPArgon2d Erweiterung bietet benutzerfreundliche Methoden zur Erstellung, Überprüfung und Erkennung von erforderlichen Aktualisierungen von Argon2d Passwort-Hashes. Für eine korrekte Verwendung der Erweiterung ist lediglich die Übergabe des Passwortes bzw. des Passwort-Hashes erforderlich. Weitere Parameter sind optional und standardmäßig sicher vorgegeben. Um die benutzerfreundliche Verwendung der Erweiterung zu veranschaulichen, werden im Folgenden zwei Beispielfunktionen vorgestellt, mit denen die Erweiterung zur Authentifizierung von Nutzern verwendet werden kann:

public function register_user(String $password, String $username):String
{
    try{
        // Calculate the password hash for the given password with the default cost parameters 
        $password_hash = argon2d_password_hash($password);
    }
    catch(Exceprion $e){
        // An error occurred while calculating the hash, which must now be handled
    }

    // Stores the password hash in the database
    $db.store($password_hash, $username)
}
public function check_credentials(String $password, String $username):bool
{
    // Get the user's stored password hash from the database
    $password_hash = db.getPasswordHash($username);

    try{
        // Check if the passed password matches the given password hash
        if(argon2d_password_hash_verify($password_hash, $password)){

            // Check if the stored password hash needs to be updated due to updated cost parameters 
            if(argon2d_password_hash_need_rehash($password_hash)){

                // Calculates a new password hash with the updated cost parameters 
                $new_password_hash = argon2d_password_hash($password);

                // Stores the new password hash in the database
                $db.store($new_password_hash, $username)
            }

            // Credentials correct 
            return true;
        }

        // Credentials incorrect
        return false;

    }
    catch(Exception $e){
        // An error has occurred during the verification or calculation of the hash, which must now be handled
    }
}

Darüber hinaus kann die Erweiterung auch zur Realisierung des Credential Checks und damit zum aktiven Schutz vor Identitätsdiebstählen eingesetzt werden. Die Berechnung der Argon2d-Hashes erfolgt dabei über die libargon2, die die offizielle C-Referenzimplementierung darstellt. Die Erweiterung kann allerdings nicht im Shared Hosting eingesetzt werden, da dort aufgrund der Verwundbarkeit gegenüber Seitenkanalangriffen keine Argon2d Passwort-Hashes berechnet werden sollen.

Umsetzung der PlainPHPArgon2d Bibliothek

Um dennoch die Berechnung von Argon2d-­Hashes für den Credential Check in allen Webhos­ting-­Arten und insbesondere für Plugins im Shared ­Hosting zu ermöglichen, wurde die PlainPHPArgon2d Bibliothek entwickelt. Diese implementiert die Berechnung eines Argon2d-­Hashes gemäß des Argon2-­RFC 9106 direkt in PHP ohne externe Softwareabhängigkeiten und kann somit auf allen PHP-Standardinstallationen zum aktiven Schutz vor Identitätsdiebstählen eingesetzt werden. Nachfolgend ist eine Beispielfunktionen dargestellt, mit der ein Argon2d-Hash für den Credential Check berechnet werden kann:

// Include the class for the Argon2d calculation
include_once("path/to/PlainArgon2d.php");

// Disables warning due to low cost parameters when calculating an Argon2d hash
error_reporting(E_ALL & ~E_USER_NOTICE);

public function get_argon2d_hash_username(String $username):String
{
    // Initialise Argon2d object 
    $argon2d = new PlainArgon2d();
    
    // Calculate the Argon2d hash of the username with a static salt and given cost parameters 
    return $argon2d->argon2d_raw_hash($username, "StaticSalt", 512, 1, 1, 16);
}

Bei der Implementierung der Bibliothek ergaben sich allerdings einige Herausforderungen. Zum einen unterstützt PHP keine vorzeichenlosen 64-Bit-Ganzzahlen, so dass diese emuliert werden müssen, was zu erhöhten Berechnungszeiten und Speicherverbrauch führt.

Zum anderen ermöglicht PHP keinen direkten Zugriff auf den Arbeitsspeicher, so dass der allokierte Speicher nach der Berechnung nicht sicher gelöscht werden kann. Hierdurch ist die Bibliothek anfällig für Garbage-Collector-Angriffe, die im Shared Hosting ein Risiko darstellen. Dieses Problem kann nur gelöst werden, indem die Bibliothek nicht im Shared Hosting verwendet wird. Allerdings überwiegt der Nutzen der Bibliothek zur aktiven Verhinderung von Identitätsdiebstählen durch den Credential Check dieses Risiko.

Evaluation

Für den praktischen Einsatz von Argon2d in PHP müssen die PHPArgon2d Erweiterung und die PlainPHPArgon2d Bibliothek in der Lage sein, Argon2d Hashes effizient zu berechnen. Um dies zu evaluieren, wurden auf dem VPS Hosting Linux S von IONOS die Berechnungszeiten und der Arbeitsspeicherverbrauch in Abhängigkeit vom Speicherbedarf analysiert. Die Evaluierung wurde auf einem Ubuntu 22.04 mit 2 GB RAM, 2 CPU-Kernen und PHP-Version 8.1 durchgeführt. Jede Messung wurde 100-mal wiederholt und der Mittelwert daraus genutzt.

Evaluation der PHPArgon2d Erweiterung

In der folgenden Abbildung sind die ermittelten Messwerte für die PHPArgon2d Erweiterung dargestellt. Daraus ist ersichtlich, dass die Erweiterung effizient Argon2d-­Hashes berechnet und in allen Anwendungsfällen verwendet werden kann, in denen die Referenzimplementierung zur Berech­nung von Argon2d-­Hashes eingesetzt wird.

Berechnungzeiten und Speicherverbrauch der PHPArgon2d Erweiterung. Die Berechnungszeiten sind im Durchschnitt 13.6% schneller als die der Referenzimplementierung. Der durchschnittliche Arbeitsspeicherverbrauch liegt 1.2% über dem übergebenen Speicherbedarf (das Optimum).
Bild: Berechnungzeiten und Speicherverbrauch der PHPArgon2d Erweiterung. Die Berechnungszeiten sind im Durchschnitt 13.6% schneller als die der Referenzimplementierung. Der durchschnittliche Arbeitsspeicherverbrauch liegt 1.2% über dem übergebenen Speicherbedarf (das Optimum).

Evaluation der PlainPHPArgon2d Bibliothek

Die ermittelten Messwerte für die PlainPHPArgon2d Bibliothek sind in der nachfolgende Abbildung dargestellt. Hieraus ist ersichtlich, dass die direkte Implementierung von Argon2d in PHP aufgrund der hohen Berechnungszeiten und des hohen Arbeitsspeicherverbrauchs nicht in der Lage ist, Argon2d-Hashes effizient zu berechnen.

Berechnungzeiten und Speicherverbrauch der PlainPHPArgon2d Bibliothek. Die Berechnungszeiten sind im Durchschnitt 954-mal langsamer als die der Referenzimplementierung. Der Arbeitsspeicherverbrauch ist im Durchschnitt 22-mal höher als der übergebene Speicherbedarf (das Optimum).
Bild: Berechnungzeiten und Speicherverbrauch der PlainPHPArgon2d Bibliothek. Die Berechnungszeiten sind im Durchschnitt 954-mal langsamer als die der Referenzimplementierung. Der Arbeitsspeicherverbrauch ist im Durchschnitt 22-mal höher als der übergebene Speicherbedarf (das Optimum).

Bereits bei der Berechnung eines Argon2d-Hashes mit einem Speicherbedarf von mehr als 7­-MiB wird das Arbeitsspeicherlimit von 128-­MiB einer PHP-­Standardinstallation über­schritten. Da die Bibliothek somit auf einer PHP-Standardinstallation keine sicheren Argon2d Passwort-­Hashes berechnen kann, ist diese nicht zum Passwort-­Hashing geeignet.

Allerdings stellt dies keine Einschränkung dar, da die PlainPHPArgon2d Bibliothek nicht zum Passwort-Hashing entwickelt wurde. Bereits bei der Konzeption wurde deutlich, dass eine direkte Implementierung von Argon2d in PHP aufgrund der Einschränkungen von PHP nicht effizient Argon2d-Hashes berechnen kann. Die Hauptfunktion dieser Bibliothek besteht daher darin, die Berechnung von Argon2d-Hashes für den Credential Check auf allen Webhosting-Arten zu ermöglichen.

Der Credential Check berechnet einen Argon2d-Hash des Nutzernamens mit einem Speicherbedarf von 0,5 MiB. Mit der Bibliothek werden dafür 12,6 MiB Arbeitsspeicher benötigt. Aufgrund der geringen Kostenparameter des Credential Checks kann die Bibliothek daher für dessen Implementierung in allen PHP-Standardinstallationen verwendet werden, auch wenn die Berechnung von Argon2d-Hashes nicht effizient erfolgt.

Evaluation der PlainPHPArgon2d Bibliothek im Shared Hosting

Da der Credential Check die Zugangsdaten der Nutzer während der Anmeldung in Echtzeit überprüft, muss die Berechnung des Argon2d-Hashes mit den Kostenparametern des Credential Checks in weniger als einer Sekunde erfolgen können. Dies entspricht der maximalen Verzögerung eines Anmeldevorgangs, die aus Nutzersicht nicht überschritten werden soll.

Die folgende Abbildung zeigt die Berechnungszeiten eines Argon2d-Hashes für den Credential Check unter Verwendung der Bibliothek im Verlauf eines Tages im Shared Hosting von 000webhost und IONOS. Aus der Abbildung ist ersichtlich, dass die Bibliothek trotz der nicht effizienten Berechnung von Argon2d-Hashes aufgrund der geringen Kostenparameter des Credential Checks die Berechnungszeiten stets unter einer Sekunde einhält. Somit kann die Bibliothek in der Praxis auf allen Webhosting-Arten zur Realisierung des Credential Checkers und damit zur aktiv Verhinderung von Identitätsdiebstählen eingesetzt werden.

Die Abbildung stellt die durchschnittlichen Berechnungszeiten eines Argon2d-Hashes für den Credential Check mit der PlainPHPArgon2d Bibliothek im Tagesverlauf im Shared Hosting von 000webhost und IONOS dar. Dabei ist zu erkennen, dass die Berechnungszeiten relativ konstant sind und immer weniger als 1 Sekunde betragen.
Bild: Die Abbildung stellt die durchschnittlichen Berechnungszeiten eines Argon2d-Hashes für den Credential Check mit der PlainPHPArgon2d Bibliothek im Tagesverlauf im Shared Hosting von 000webhost und IONOS dar. Dabei ist zu erkennen, dass die Berechnungszeiten relativ konstant sind und immer weniger als 1 Sekunde betragen.

Aufgrund der effizienten Berechnung von Argon2d-Hashes sollte die Erweiterung bevorzugt zur Realisierung des Credential Checks eingesetzt werden. Wird die Bibliothek dennoch für den Credential Check verwendet, sollte der Argon2d-Hash des Nutzernamens zusammen mit dem Passwort-Hash dauerhaft gespeichert werden, um Verzögerungen bei der Anmeldung zu reduzieren. Dies ist möglich, da der berechnete Argon2d-Hash des Nutzernamens bei der Anmeldung immer gleich ist. Nur bei einer Änderung des Nutzernamens muss der gespeicherte Argon2d-Hash aktualisiert werden.

Fazit

Zusammenfassend kann festgestellt werden, dass mit der Entwicklung der PHPArgon2d Erweiterung und der PlainPHPArgon2d Bibliothek ein wichtiger Beitrag zur Verbesserung der Sicherheit von Nutzern und Dienstanbietern vor Identitätsdiebstahl geleistet wird, da diese nun noch besser aktiv und präventiv davor geschützt werden können. Besonders hervorzuheben ist, dass sowohl die PHPArgon2d Erweiterung als auch die PlainPHPArgon2d Bibliothek im Rahmen der Evaluation ihre Eignung für den praktischen Einsatz von Argon2d in PHP erfolgreich unter Beweis gestellt haben.

Über diese Arbeit

Die Entwicklung der PHPArgon2d Erweiterung und der PlainPHPArgon2d Bibliothek erfolgte im Rahmen einer Bachelorarbeit an der Rheinischen Friedrich-Wilhelms-Universität Bonn in Kooperation mit Identeco. Der Quellcode der PHPArgon2d Erweiterung und der PlainPHPArgon2d Bibliothek ist auf GitHub unter der MIT-Lizenz verfügbar.

Experten kontaktieren

Sie haben weitere Fragen zum Thema oder benötigen konkrete Hilfe? Schreiben Sie uns eine Nachricht oder vereinbaren Sie direkt einen Termin für ein Gespräch.

Weiterlesen

Zum Blog