Client-Seite (Javascript) Datei-Upload-Verschlüsselung [geschlossen]

9

Ich versuche eine Methode zum Verschlüsseln einer Datei-Client-Seite zu erstellen und sie hochzuladen. Ziel ist es, die Datei verschlüsselt auf dem Server zu speichern und nur der Endbenutzer sollte in der Lage sein, die Datei zu entschlüsseln. Diese Frage wurde vorher gestellt , aber ich denke, ich habe etwas mehr Fortschritte gemacht.

Mein Plan ist es, die neue JavaScript-Datei-API zu verwenden, um die Datei zu manipulieren und hochzuladen. Die Verschlüsselung könnte mit der Stanford Javascript Crypto Library durchgeführt werden. Die Datei sollte in Blöcken gelesen werden, damit sie nicht vollständig in den Speicher gelesen wird. Jedes Stück wird dann von der Kryptothek verschlüsselt. Ich kann mir nicht vorstellen, wie ich das umsetzen soll. Als Anfang habe ich das:

%Vor%

Was ist nur ein regulärer Javascript-Upload? Ich versuche, ein Crypt-Objekt zu erstellen, das das Verhalten eines File-Objekts nachahmt und dieses an FormData weitergibt. Für jeden von formdata gelesenen Datenblock sollte das Objekt einen Chunk aus der Datei lesen und diesen verschlüsseln. Ich kann einfach nicht herausfinden, wie FormData ein File-Objekt verarbeitet und ob es möglich ist, dieses Verhalten zu replizieren. Ich bin mir nicht sicher, ob es der richtige Weg ist, jemand hat einen Vorschlag?

UPDATE: Ok, ich bin jetzt viel weiter. Ich verwende file.slice, um die Datei in Blöcken zu lesen. Dann wird jeder Chunk verschlüsselt und mit einem BlobBuilder wieder in einen Blob transformiert. Dieser Blob wird dann in ein FormData-Objekt eingefügt und an den Server gesendet. Der Server verkettet diese Blobs. Das Verschlüsseln und Entschlüsseln eines Chunks mit dem Browser funktioniert. Jetzt arbeite ich an Download und Entschlüsselung mehrerer Chunks.

Es gibt noch einige Probleme zu lösen:

  • Der Name der Datei ist verloren, es ist noch nicht möglich, einen Dateinamen für ein Dateiobjekt festzulegen.
  • Die Verschlüsselung blockiert immer noch (kein ui update), aber ich denke, ich kann das mit Webworkern lösen.
  • Ich kann die Chunk-Größe beim Herunterladen nicht vorhersagen. Die unverschlüsselte Chunk-Größe ist bekannt, aber für verschlüsselte Daten scheint dies unterschiedlich zu sein. Diese verschlüsselten Daten werden in JSON-Form gespeichert, ich bevorzuge keine Zeichenkettensuche nach}. Und ich bevorzuge es, diese Serverseite nicht zu speichern.
  • Obwohl ich die Datei chunked lese, scheint Firefox ein Speicherleck zu haben oder die komplette Datei in den Speicher zu lesen. Dies wird zu einem Problem für Dateien mit mehreren Gigabyte.
Gijs Molenaar 04.10.2011, 10:36
quelle

1 Antwort

6

Es folgt eine Lösung, die Dateien stark schützt.

Pro:

  • Ein Angreifer kann auf den Server zugreifen, aber er kann die Daten nicht verwenden.
  • Selbst Sie (der Entwickler) können nicht auf die Daten zugreifen.

Nachteile:

  • Wenn der Benutzer sein Passwort verliert, gehen auch Daten verloren.
  • Selbst Sie (der Entwickler) können nicht auf die Daten zugreifen (das heißt, Sie können dem Benutzer nicht helfen, wenn er auf Probleme stößt).

Wenn es das ist, was du brauchst, pass auf ^^. Hinweis: Alles was folgt, passiert auf der Serverseite.

  1. verwende https für alle Übertragungen
  2. Wenn sich der Benutzer anmeldet, erstellen Sie einen Hash des Benutzerpassworts (z. B. sha (password + salt))
  3. Speichern Sie den Hash in der Benutzersitzung
  4. Wenn ein Upload abgeschlossen ist, verwenden Sie die symmetrische Verschlüsselung (z. B. AES), um die Daten mit dem in der Sitzung gespeicherten Hash als Schlüssel zu verschlüsseln.
  5. Wenn ein Download abgeschlossen ist, verwenden Sie dieselbe symmetrische Entschlüsselungsmethode, um die Datei zu entschlüsseln und sie an den Benutzer zurückzusenden.

Dies bedeutet, dass nur ein angemeldeter Benutzer auf die Daten zugreifen kann. Und nur der Benutzer, zu dem die Daten gehören. Die einzige Möglichkeit, auf die Daten des Benutzers zuzugreifen, besteht darin, sein Passwort zu kennen.

Hinweis: Wenn der Benutzer, der die Datei hochlädt und derjenige, der die Datei liest, nicht dieselbe Person ist, können Sie stattdessen eine Kombination aus asymmetrischer und symmetrischer Verschlüsselung verwenden:

  1. generiert ein öffentliches / privates Schlüsselpaar für den Empfänger.
  2. (symmetrisch) verschlüsselt den privaten Schlüssel mit dem Hash des Empfängers oder a Abhängigkeit von     sein Passwort.
  3. Wenn eine Datei hochgeladen wird, asymmetrische Verschlüsselung mit dem Empfänger öffentlicher Schlüssel.

  4. (neu) Asymmetrische Verschlüsselung scheint wesentlich langsamer zu sein als symmetrische Verschlüsselung (10-100x je nach Algorithmus / Architektur). Daher ist es viel besser, eine Zufallszahl (den Sitzungsschlüssel) zu generieren, zweimal zu verschlüsseln (einmal mit dem öffentlichen Schlüssel des Absenders, einmal mit dem öffentlichen Schlüssel des Empfängers) und sie zu speichern. Verwenden Sie dann die symmetrische Verschlüsselung, um die Datei zu verschlüsseln (verwenden Sie den einfachen Sitzungsschlüssel als symmetrischen Schlüssel).

  5. Wenn der Empfänger auf die Datei zugreifen möchte:

    a) entschlüsseln Sie seinen privaten Schlüssel mit seiner Hash- oder Passwortabhängigkeit.

    b) asymmetrisch entschlüsseln Sie die Datei mit dem privaten Schlüssel.

    b) (neu) Verwenden Sie den privaten Schlüssel, um den verschlüsselten Sitzungsschlüssel des Empfängers zu entschlüsseln. Verwenden Sie dann die symmetrische Entschlüsselung, um die Datei zu entschlüsseln.

Hoffe, das hilft.

    
Vincent Pazeller 02.02.2013 14:46
quelle