Verschlüsselung - Feste Keys/Salts für eine Session?

  • C#
  • .NET (FX) 4.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Verschlüsselung - Feste Keys/Salts für eine Session?

    Servus Leute,

    um eine Verbidnung quer durchs Internet abzusichern benutze ich mitunter folgende Datei:
    github.com/bluebirdtech/AESThe…ESThenHMAC/AESThenHMAC.cs

    Wie dort drinnen zu sehen ist, wird bei jeder Ent- und Verschlüsselung von neuem der CipherKey und der AuthKey mit neuen Salts abgeleitet. Wenn ich nun jedoch beide Keys aufbewahre, sodass diese für eine gesamte Session gleich bleiben, und somit keine neuen Salts erstelle und daraus neue Keys ableite, ergibt sich daraus ein Sicherheitsproblem?

    Hintergrund:
    Ich habe herausgefunden, dass ein einzelner Ver- oder Entschlüsselungsvorgang ~170ms für das Ableiten benötigt, was bedeutet, dass bei einer Anfrage eines Clients mitsamt Antwort vom Server, ungefähr eine Sekunde vergeht, ohne dass irgendwelche Daten verarbeitet wurden. Dies möchte ich eben einsparen, da sich Server und Client recht frequent Nachrichten schicken, sofern sie miteinander verbunden sind. Da mit jeder Anfrage mind. 1 Sekunde Zeit vergeht, ohne dass überhaupt erst am Ergebnis gerechnet wurde, ist das bei bereits 10 Anfragen schon viel Wartezeit für nichts, was der User jemals zu Gesicht bekommt.
    Ich denke, bei verschlüsselten verbindungs-orientierten Kommunikations-Protokollen ists üblich, mit Sessions zu arbeiten, und eine Session bewahrt den symmetrischen Schlüssel auf.
    Asymmetrische Verschlüsselung dient nicht der Kommunikation, sondern einzig dem geschützten Schlüssel-Tausch der symmetrischen Schlüssel, die schlussendlich zum Kommunizieren verwendet wern.

    ErfinderDesRades schrieb:

    mit Sessions zu arbeiten, und eine Session bewahrt den symmetrischen Schlüssel auf.
    Okay, das gibt mit zumindest schonmal etwas Sicherheit, dass meine "Modifikation" genauso sicher ist, wie das Ursrpüngliche Dokument.

    ErfinderDesRades schrieb:

    Asymmetrische Verschlüsselung dient nicht der Kommunikation
    Ich weiß zwar nicht, wie du auf asymmetrische Verschlüsselung kommst, aber klar, die Schlüsselübergabe erfolgt per RSA. Danach wird ausschließlich AES verwendet.

    EaranMaleasi schrieb:

    Ich weiß zwar nicht, wie du auf asymmetrische Verschlüsselung kommst
    Ich muss gestehen, die Datei garnet angeguckt zu haben (ich bin nicht so der Freund von hingeworfenem Code nach dem Motto "ihr versteht schon was ich meine").

    Ich habe nur hierauf reagiert, weil da sagst du, was du machen willst:

    EaranMaleasi schrieb:

    um eine Verbidnung quer durchs Internet...

    Jo, und in meiner Welt gibts keine sichere Verbindung quer durchs INet, die ohne asymetrisch verschlüsselten Schlüssel-Tausch auskommt - so bin ich drauf gekommen.

    Aber hab deine Datei nu doch angeguckt, und vlt. kann die Solution von Verschlüsseln und Autentifizieren dir noch Impulse geben.
    Arbeitet vom Prinzip her wie deine Datei - also der CypherText (ist bei mir ein Stream, kein byte[]) enthält eine unverschlüsselte Präambel mit IV und Salt.

    Spart aber einige Umwandlungen von Stream <-> byte[] ein, indem direkt mit Streams gearbeitet wird.

    Zur Performance: Deine Iterations-Tiefe von 10000 - also ich kenn mich nicht wirklich aus, aber ist das nötig? - ich hab nur 1000, und dachte, das sei schon viel. Zumindest kannste testen, obs genau daran hängt (aber ich nehme fast an, haste schon getestet).

    Jdfs ich würde in einer "Session" einfach den AESManager mehrfach verwenden, ohne ihn jedesmal zu disposen.
    Eine andere Überlegung ist, ob man eine Session nicht einfach direkt als Stream versteht. ZB ein NetworkStream ist ja Repräsentant einer TCP-Verbindung, und kann man als "Session" auffassen, und durchaus mehrere einzelne Nachrichten mit übermitteln.
    Letzteres (mehrere einzelne Nachrichten über denselben Networkstream) ist nichttrivial, aber habich eine Lösung für gebastelt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Zur Performance: Deine Iterations-Tiefe von 10000 - also ich kenn mich nicht wirklich aus, aber ist das nötig? - ich hab nur 1000, und dachte, das sei schon viel. Zumindest kannste testen, obs genau daran hängt (aber ich nehme fast an, haste schon getestet).
    Ich habe sogar gelesen, dass Iterationswerte zwischen 65.536 (216) und 1.048.576 (220) empfohlen seien, vermutlich deswegen, da nur einmal der Key abgeleitet wird.
    Aber ja, seitdem ich nun die gesamte Verschlüsselung umgestellt habe, sodass ich nur einmal den Key ableite, anstatt bei jeder Nachricht, geht das ganze Ruckzuck.

    ErfinderDesRades schrieb:

    ZB ein NetworkStream ist ja Repräsentant einer TCP-Verbindung
    Ich arbeite hier mit WCF, hab also keine Streams oder dergleichen, lediglich Funktionsaufrufe.

    Mir ist durchaus bewusst, dass WCF mit SSL-Zertifikaten arbeiten kann, doch ich hab im moment keine einfachere Möglichkeit, als die Verschlüsselung selbst "oben drauf" zu Programmieren.