
Ich habe kürzlich am Ethereum-Hackathon teilgenommen und möchte heute über das EtherAuth-Projekt sprechen, mit dem das MixBytes-Team den dritten Platz belegte. EtherAuth ist ein Versuch, eine dezentrale Version einer Site-Anmeldung mit einem externen Konto zu erstellen. Melden Sie sich als Schaltfläche über Facebook an, nur ohne Facebook.
Problem und Lösungen
Wenn Sie einen geschlossenen Bereich für Benutzer auf Ihrer Website einrichten möchten, müssen Sie Folgendes auswählen: Entwickeln Sie ein eigenes System zur Identifizierung, Authentifizierung und Autorisierung von Benutzern oder verwenden Sie eine vorgefertigte Lösung. Eine schlüsselfertige Lösung bedeutet, dass Ihr Benutzer bereits ein Konto in einem System hat (Facebook, Google, Yahoo, Outlook oder auch nur E-Mail). Und Sie verwenden den entsprechenden Mechanismus (meistens das OAuth 2.0-Protokoll), um sicherzustellen, dass jemand, der versucht, sich mit einer externen Benutzer-ID bei Ihrer Site anzumelden, dieser Benutzer ist.
Die letztere Option ist einfacher zu implementieren, es besteht jedoch ein Risiko für den Benutzer: Wenn etwas mit seinem Hauptkonto passiert (z. B. blockiert Facebook das Konto ohne Angabe von Gründen), verliert er auch den Zugriff auf seine Informationen auf Ihrer Website.
Wenn ich mich als Benutzer bei einer Site anmelden möchte, der ich noch nicht vertraue, muss ich dieser Site außerdem Zugriff auf meine persönlichen Informationen wie E-Mail oder Alter gewähren. Wenn die Site nur die Anmeldung mit einem externen Konto unterstützt, muss ich buchstäblich eine Entscheidung treffen: die Nutzung der Site verweigern oder meine Anonymität opfern.
Die meisten Benutzer opfern die Anonymität mit den Worten "Was für ein schreckliches Ereignis kann, ich habe nichts zu verbergen." Leider beginnen die meisten Angriffe auf einen unvorbereiteten Benutzer, die zu Geldverlusten führen, mit ähnlichen Worten. "Was für ein Schreckliches kann passieren, wenn ich einen Code per SMS an einen Bankangestellten sende?" "Was für eine schreckliche Sache kann passieren, wenn ich einem Mitarbeiter des technischen Supports die Anforderungsheader sende?" Die Antwort auf diese Frage wird meistens herausgefunden, wenn nichts getan werden kann.
Wie kann Ethereum hier helfen? Wir haben bereits erkannt, dass es drei Hauptprobleme gibt:
- Der Benutzer ist nicht verpflichtet, der von ihm besuchten Website zu vertrauen, und möchte das Auslaufen persönlicher Informationen vermeiden.
- Die Site möchte ein externes Authentifizierungssystem verwenden, um das Speichern von Benutzerdaten und die damit verbundenen Sicherheitskosten zu vermeiden.
- Bestehende externe Systeme, die Websites die Möglichkeit bieten, Benutzer zu authentifizieren, bergen die Gefahr der Zensur. Jedes Konto kann jederzeit ohne Erklärung und manchmal ohne die Möglichkeit einer Wiederherstellung gesperrt werden.
Wir können das Ethereum-Netzwerk anstelle eines externen Systems verwenden und nur den erforderlichen Datensatz darin speichern. Wir müssen darauf achten, keine geheimen Informationen im öffentlichen Bereich zu speichern. Da es sich bei jeder Brieftasche im Ethereum-Netzwerk jedoch tatsächlich um ein Paar kryptografisch starker Schlüssel handelt, bei denen der öffentliche Schlüssel die Brieftaschenadresse bestimmt und der private Schlüssel niemals über das Netzwerk übertragen wird und nur dem Eigentümer bekannt ist, sind wir Wir können asymmetrische Verschlüsselung verwenden, um Benutzer zu authentifizieren.
Im einfachsten Fall können Sie die Ethereum-Brieftaschenadresse als Benutzer-ID verwenden. Hier tritt jedoch ein Problem auf: Im Falle eines Schlüssellecks verliert der Benutzer für immer den Zugriff auf das System. Genauer gesagt, ab dem Moment, an dem der geheime Schlüssel des Benutzers dem Angreifer bekannt wurde oder einfach versehentlich in den öffentlichen Zugriff geriet, können wir einen solchen Schlüssel nicht zur Authentifizierung verwenden.
Implementierung
In unserer Lösung habe ich einen einfachen EtherAuth-Smart-Vertrag zum Speichern von Benutzer-IDs und zugehörigen Brieftaschenadressen geschrieben. Die Benutzer-ID ist nur eine UTF-8-Zeichenfolge mit einer Größe zwischen 2 und 32 Byte. Es wurde einmal vom Benutzer selbst erfunden und später verwendet, um sich bei einer Site anzumelden, die EtherAuth unterstützt. Heute würde ich die möglichen Zeichen in der Zeichenfolge einschränken und die Möglichkeit lassen, lateinische Zeichen und arabische Ziffern (Teilmengen der 7-Bit-ASCII-Codierung) zu verwenden, um die Möglichkeit zu beschränken, extern ähnliche Anmeldungen zu erstellen.
Beim Erstellen eines Kontos in EtherAuth wird ein Schlüsselpaar festgelegt: ein Autorisierungsschlüssel (authAddr) und ein Schlüssel zum Wiederherstellen des Zugriffs (recoveryKey). Der Name recoveryKey ist nicht ganz erfolgreich, da diese Adresse nicht nur zur Wiederherstellung, sondern auch zur Verwaltung des Kontos verwendet wird. Beim Erstellen entsprechen beide Adressen der Brieftaschenadresse, für die die Transaktion gesendet wurde. Ein Benutzer, der sich um seine Sicherheit kümmert, sollte jedoch einen separaten Steuerschlüssel erstellen und an einem Ort speichern, auf den über das Netzwerk nicht zugegriffen werden kann. Ich würde es sogar in Form von 12 mnemonischen Wörtern in einem Safe auf Papier aufbewahren, damit ich bei Bedarf ein paar Schlüssel neu erstellen kann.
Es ist auch ratsam, eine separate Brieftaschenadresse für die Authentifizierung zu verwenden, die von der Brieftaschenadresse getrennt ist, in der Ihr gesamter Ether gespeichert ist. Die Beziehung von authKey zur Adresse der Brieftasche, die das Konto erstellt hat, kann weiterhin durch Analyse der Transaktionssequenz des Smart-Vertrags verfolgt werden. Jetzt können Sie beim Erstellen eines Kontos keinen separaten AuthKey und RecoveryKey festlegen. Wenn Sie jedoch den Smart-Vertrag in diese Richtung verfeinern, wird die Adresse, die das Konto erstellt hat, nicht unbedingt dem Kontoinhaber zugeordnet, sodass jeder seine Anonymität schützen kann.
Für die Benutzerinteraktion mit dem Smart-Vertrag haben wir eine separate Webseite erstellt. Sie können ein Konto darauf erstellen, seine Schlüssel ändern oder es löschen. Um zu arbeiten, muss der Benutzer das MetaMask-Browser-Plugin installieren. Wenn Sie das Ethereum-Netzwerk bereits aktiv nutzen, haben Sie dieses Plugin höchstwahrscheinlich bereits installiert. Das heißt, die Mehrheit der Benutzer, die die Site über Ethereum betreten möchten, stößt auf ihrem Weg nicht auf ein zusätzliches Hindernis.
Der allgemeine Benutzerauthentifizierungsprozess mit EtherAuth sieht folgendermaßen aus:
- Die Site (Backend) wird zu einem intelligenten Vertrag und erhält die Ethereum-Adresse des Benutzers.
- Die Site (Backend) generiert und merkt sich eine Nachricht und fordert den Benutzer auf, diese Nachricht mit der authKey-Adresse zu signieren.
- Der Benutzer, der sich auf der Site (Frontend) befindet, signiert die Nachricht mit dem MetaMask-Plugin und sendet sie an das Backend.
- Die Site (Backend) überprüft die Signatur und aktiviert die Benutzersitzung gemäß der von ihr gewählten Logik, wenn alles in Ordnung ist.
In unserer Lösung für den Hackathon haben wir der Einfachheit halber die Teile Backend und Frontend kombiniert und ein großes Frontend erhalten. Im wirklichen Leben ist es wichtig, dass die Authentifizierungsüberprüfung in einer nicht benutzergesteuerten Umgebung stattfindet, dh nicht im Browser, sondern auf dem Server.
Von den Problemen, auf die wir gestoßen sind, können wir die Überprüfung der Signatur im Frontend-Teil feststellen. Es gab keine Unterstützung für elliptische Kurven im Browser, daher musste ich dem Smart-Vertrag eine Funktion hinzufügen, die das ecrecover-Ergebnis aus der Nachricht zurückgibt, und lernen, wie Parameter korrekt an sie übergeben werden (erhalten Sie sie aus einer von MetaMask signierten Nachricht).
Als Ergebnis erhielten wir innerhalb von zwei Tagen einen Proof-of-Concept der dezentralen Authentifizierung mithilfe des Ethereum-Netzwerks und des MetaMask-Plugins. Wir verstehen, wie dieses System verfeinert werden kann, um dem Benutzer Anonymität zu verleihen. Der Benutzer kann den Zugriff im Falle eines Lecks seines Primärschlüssels wiederherstellen (jedoch nicht im Falle eines Lecks des Wiederherstellungsschlüssels). Ein dezentrales System unterliegt nicht der Zensur großer Strukturen wie Google oder Facebook. Wenn eine Zensur erforderlich ist, sollte die Site diese selbst ausführen. Dies kann jedoch nur innerhalb ihres eigenen Systems erfolgen, ohne den Benutzerzugriff auf andere Systeme zu beeinträchtigen. Das Ethereum-Netzwerk führt Transaktionen nicht sehr schnell durch (beim Erstellen eines Kontos muss der Benutzer möglicherweise einige Minuten warten), es ist jedoch möglich, Daten abzurufen und die Benutzerauthentifizierung sehr schnell zu überprüfen. Diese Lösung lässt sich gut skalieren, da es viele Knoten mit Daten gibt und jeder jederzeit einen weiteren hinzufügen kann. Die Komplexität der Implementierung einer solchen Lösung für Websitebesitzer ist nicht höher als die Komplexität der Implementierung der Unterstützung für OAuth 2.0.
Fazit
Natürlich sind Benutzer, die das Ethereum-Netzwerk nutzen, heute im Vergleich zur Anzahl der Facebook-Benutzer vernachlässigbar. Die Popularität von Blockchain-Technologien nimmt jedoch zu, und ich glaube, dass es in absehbarer Zukunft immer mehr solcher Benutzer geben wird, was bedeutet, dass es möglich sein wird, die dezentrale Authentifizierung in industriellen Systemen zu verwenden.
Referenzen