WebCrypto
Die Bedenken hinsichtlich der Kryptografie in clientseitigem (Browser-) Javascript werden nachstehend erläutert. Alle bis auf eines dieser Probleme gelten nicht für die WebCrypto-API , die jetzt einigermaßen gut unterstützt wird .
Für eine Offline-App müssen Sie weiterhin einen sicheren Keystore entwerfen und implementieren.
Nebenbei: Wenn Sie Node.js verwenden, verwenden Sie die integrierte Krypto- API.
Native-Javascript-Kryptographie (vor WebCrypto)
Ich gehe davon aus, dass das Hauptanliegen jemand ist, der physischen Zugriff auf den Computer hat, der die Informationen localStorage
für Ihre Site liest , und Sie möchten, dass Kryptografie dazu beiträgt, diesen Zugriff zu verhindern.
Wenn jemand physischen Zugang hat, sind Sie auch offen für andere und schlimmere Angriffe als das Lesen. Dazu gehören (ohne darauf beschränkt zu sein): Keylogger, Offline-Skriptänderung, lokale Skriptinjektion, Browser-Cache-Vergiftung und DNS-Weiterleitungen. Diese Angriffe funktionieren nur, wenn der Benutzer den Computer verwendet, nachdem er kompromittiert wurde. Der physische Zugriff in einem solchen Szenario bedeutet jedoch, dass Sie größere Probleme haben.
Denken Sie also daran, dass das begrenzte Szenario, in dem lokale Krypto wertvoll ist, darin besteht, dass der Computer gestohlen wird.
Es gibt Bibliotheken, die die gewünschte Funktionalität implementieren, z. B. die Stanford Javascript Crypto Library . Es gibt jedoch inhärente Schwächen (wie im Link aus der Antwort von @ ircmaxell erwähnt):
- Fehlende Entropie- / Zufallszahlengenerierung;
- Fehlen eines sicheren Schlüsselspeichers, dh der private Schlüssel muss passwortgeschützt sein, wenn er lokal oder auf dem Server gespeichert ist (wodurch der Offline-Zugriff gesperrt wird).
- Mangel an sicherer Löschung;
- Fehlende Timing-Eigenschaften.
Jede dieser Schwächen entspricht einer Kategorie kryptografischer Kompromisse. Mit anderen Worten, während Sie vielleicht "Krypto" mit Namen haben, wird es weit unter der Strenge liegen, die man in der Praxis anstrebt.
Abgesehen davon ist die versicherungsmathematische Bewertung nicht so trivial wie "Javascript-Krypto ist schwach, verwenden Sie es nicht". Dies ist keine Bestätigung, sondern eine Einschränkung. Sie müssen die Aufdeckung der oben genannten Schwachstellen, die Häufigkeit und die Kosten der Vektoren, mit denen Sie konfrontiert sind, sowie Ihre Fähigkeit zur Schadensbegrenzung oder Versicherung im Falle eines Fehlers vollständig verstehen: Javascript crypto, in Trotz seiner Schwächen kann Ihre Exposition verringert werden, jedoch nur gegen Diebe mit begrenzter technischer Kapazität. Sie sollten jedoch davon ausgehen, dass Javascript-Krypto keinen Wert gegen einen entschlossenen und fähigen Angreifer hat, der auf diese Informationen abzielt. Einige würden es für irreführend halten, die Daten als "verschlüsselt" zu bezeichnen, wenn bekannt ist, dass der Implementierung so viele Schwachstellen inhärent sind. Mit anderen Worten, Sie können Ihr technisches Risiko geringfügig verringern, aber Ihr finanzielles Risiko durch Offenlegung erhöhen. Natürlich ist jede Situation anders - und die Analyse der Reduzierung des technischen Engagements gegenüber finanziellen Risiken ist nicht trivial. Hier ist eine veranschaulichende Analogie:Einige Banken benötigen trotz des inhärenten Risikos schwache Passwörter , da ihre Verluste durch schwache Passwörter geringer sind als die Endbenutzerkosten für die Unterstützung starker Passwörter.
🔥 Wenn Sie den letzten Absatz gelesen haben und dachten "Ein Typ im Internet namens Brian sagt, ich kann Javascript-Krypto verwenden", verwenden Sie keine Javascript-Krypto.
Für den in der Frage beschriebenen Anwendungsfall erscheint es für Benutzer sinnvoller, ihre lokale Partition oder ihr Ausgangsverzeichnis zu verschlüsseln und ein sicheres Kennwort zu verwenden. Diese Art von Sicherheit ist im Allgemeinen gut getestet, allgemein vertrauenswürdig und allgemein verfügbar.