Speichern eines verschlüsselten privaten Schlüssels auf einem Server

Ich plane den Aufbau einer kleinen E-Wallet-Website, um die Grundlagen der Verschlüsselung und des Umgangs mit Konten, Transaktionen und Guthaben in Bitcoin zu erlernen.

Ich möchte lernen, wie man eine Website erstellt, bei der die Datenbank keine privaten Daten enthält.

Welchen clientseitigen Verschlüsselungs- und Hashalgorithmus sollte ich verwenden? Welchen Algorithmus oder Prozess sollte ich verwenden, um sicherzustellen, dass die verschlüsselten und gehashten Daten der Benutzer auf dem Server sicher sind?

Bei Verwendung von brainwallet ist der Prozess für die Kontoerstellung wie folgt:

  1. Der Client erstellt einen privaten Schlüssel.
  2. Der Benutzer gibt einen Benutzernamen/ein Passwort ein
  3. Der Client verschlüsselt den privaten Schlüssel mit einem Passwort. Der Client hasht das Passwort und den Benutzernamen. Der Client sendet Daten an den Server.
  4. Der Server speichert den gehashten Benutzernamen/das Passwort und den verschlüsselten privaten Schlüssel in der Datenbank.

Wenn ein Benutzer jetzt eine Transaktion auf meiner Website ausgeben möchte, versuche ich, Brainwallet zum Senden von Transaktionen zu verwenden. Der Prozess dafür wird sein:

  1. Der Benutzer gibt einen Benutzernamen und ein Kennwort ein.
  2. Der Client sendet einen gehashten Benutzernamen/Passwort an den Server.
  3. Der Server antwortet mit einem verschlüsselten privaten Schlüssel für diesen Benutzer.
  4. Der Client entschlüsselt den privaten Schlüssel mit einem Passwort.

Als Nebenbemerkung: Ist dies ein solider Prozess zum Speichern und Übertragen von Daten an den Server?

Antworten (1)

Ich plane den Aufbau einer kleinen E-Wallet-Website, um die Grundlagen der Verschlüsselung und des Umgangs mit Konten, Transaktionen und Guthaben in Bitcoin zu erlernen.

Dies ist wirklich nicht der richtige Ort zum Lernen. Selbst die härtesten Bitcoin-Dienste werden regelmäßig angegriffen.

Bei Verwendung von brainwallet ist der Prozess für die Kontoerstellung wie folgt:

"Brain Wallets" sind eine unglaublich einfache Möglichkeit für Benutzer, ihr gesamtes Geld zu verlieren. Es passiert jeden Tag. Denken Sie, dass Ihr 8-Wort-Satz stark genug ist? Die Chancen stehen gut, dass dies nicht der Fall ist, und es gibt mindestens drei Bots, die die Brieftasche innerhalb von Sekunden leeren, nachdem sie Geld erhalten haben.

Wenn ein Benutzer jetzt eine Transaktion auf meiner Website ausgeben möchte, versuche ich, Brainwallet zum Senden von Transaktionen zu verwenden.

Der Code, auf den Sie verweisen, ist nur ein Frontend für blockchain.info und die bitcoinjs-Bibliothek.

Als Nebenbemerkung: Ist dies ein solider Prozess zum Speichern und Übertragen von Daten an den Server?

Blockchain.info verwendet diese Methode für seine Web-Wallet, aber nein, sie ist sehr unsicher und bietet nur sehr wenig Sicherheit. Wenn Ihr Server kompromittiert ist, sind die Schlüssel es immer noch. Wenn Sie böswillig sind, können Sie das Client-Skripting einfach durch eine Hintertür öffnen, und niemand würde es jemals erfahren. Es ist nicht sicher, und ein Dienst, der diese Art von System verwendet, sollte sich nicht als solcher bewerben.

Der Brainwallet-Code, den ich verlinkt habe, ist kein echtes Brain Wallet, sondern eine Javascript-Implementierung der Adressgenerierung und Transaktionserstellung / -signierung. Ich denke, dass die Sicherheit, die durch das Speichern eines verschlüsselten privaten Schlüssels anstelle eines privaten Klartextschlüssels gewonnen wird, erheblich ist. Wenn ein Benutzer ein Webwallet verwendet, wird er am Ende des Tages blockchain.info jedem Konkurrenten vorziehen, der Zugriff auf seinen privaten Schlüssel im Klartext hat.
Blockchain.info hat ohnehin Zugriff auf die privaten Schlüssel, man müsste schon ein Narr sein, um etwas anderes zu glauben. Wenn nicht sie, jemand mit Root auf ihren Rechnern oder jemand bei Cloudflare oder der Hausmeister im Rechenzentrum. JavaScript-basierte Kryptographie kann und wird niemals sicher sein, wenn der Code, der die Daten schützt, von einem möglicherweise gegnerischen Server geladen wird. Selbst wenn es keine Hintertür gäbe (ich sage nicht, dass es eine gibt), ist jede JS-Verschlüsselung schwach und langsam, was durch die Tatsache verstärkt wird, dass Benutzer schlechte Passwörter wählen. Es ist besser, einfach auf den Schleier falscher Sicherheit zu verzichten und die Schlüssel serverseitig zu speichern.