Christian Kruse: Verschlüsselung

Beitrag lesen

Moin 1UnitedPower,

Die kam gestern Abend: Die End- zu End-Verschlüsselung findet mit RSA statt. Die Schlüssel werden vom Client generiert, also von einer JavaScript-Implementation.

Urghs, keine gute Idee, aus diversen Gründen. Hier ein paar davon:

  • sicheres ausliefern von JS an den Browser ist ein Henne-Ei-Problem. Man vertraut dem Dienste-Anbieter nicht, dass er die Daten sicher verwaltet und will sie deshalb im Browser verschlüsseln. Also kann man auch nicht davon ausgehen, dass der JS-Code sicher ist: er könnte von einem Angreifer abgegriffen, verändert oder ersetzt worden sein.
  • der Browser ist (noch) keine geeignete Umgebung, um Kryptografie zu betreiben, aus mehreren Gründen:
      - der Code kann sich im Laufe der Session ändern (JS-Code kann sich aus mehreren HTTP-Requests zusammen setzen, jeder Request kann den Code ändern oder überschreiben, usw, pp).
      - die JS-Engine selber angegriffen werden, beinahe alle der neueren Sicherheitslücken in Browsern lassen sich auf JS zurückführen
      - die Art und Weise, wie die Umgebung sich verhält, kann sogar zur Runtime geändert werden
      - es fehlen wichtige Elemente in Browser-JS, etwa kryptografischer Zufall (das ist extrem wichtig, schwacher Zufall führt zu schwachen oder vorhersagbaren Keys; es hat seinen Grund, dass die NSA versucht hat, schwachen Zufall in die Standards einzuschläusen) oder ein sicherstellen, dass Speicher auch wirklich weg ist, wenn man ihn nicht mehr braucht (Stichwort Garbage Collection) oder auch nur ein Key Store
      - die Tatsache, dass sich das Verhalten der Umgebungen massiv voneinander unterscheiden, abhängig von OS, Browser, Hardware, installierter Software, usw, pp (siehe z.B. canvas fingerprinting)

Ich könnte mich noch deutlich länger darüber auslassen, warum Crypto im Browser nicht sinnvoll ist, aber dazu gibt es wirklich schon genug Artikel im Web, geeignete Stichworte dürften „browser cryptography critics“ sein.

LG,
 CK