PwKeySetHolder - Sicherer Umgang mit Passwörter / Keyset während der Laufzeit

    • Release
    • Closed Source

    Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

      PwKeySetHolder - Sicherer Umgang mit Passwörter / Keyset während der Laufzeit

      Hallo Community


      Name:

      PwKeySetHolder


      Verwendete Programmiersprache(n) und IDE(s):

      Dll: VS 2017 - FW 4.7.1 - C# 7.3
      TestForm: VS 2017 - FW 4.7.1 - VB.NET


      Screenshot(s):


      Systemanforderungen:


      Windows 10


      Lizenz/Weitergabe:

      Freeware; Closed


      Beschreibung:

      Für das Generieren und Aufbewahren von einem KeySet bzw. von Passwörtern während der Laufzeit habe ich hier eine kleine Dll (Assembly) mit dem Namen PwKeySetHolder erstellt.

      PwKeySetHolder verwaltet das verkryptete KeySet als Byte-Array, nimmt aber nur Jagged-Byte-Arrays entgegen, oder gib sie so wieder aus. Es kann jederzeit ein neues KeySet generiert werden, das verkryptet im Arbeitsspeicher aufbewahrt wird. Dazu generiert PwKeySetHolder wiederum jeweils eigene neue Parameter für den internen Schlüsselsatz, die auch verkryptet im Arbeitsspeicher vorliegen.

      Wer möchte, kann das KeySet mittels Eingabe eines persönlichen Passwortes auf die HDD ablegen, und zum späteren Zeitpunkt wieder (mit Passworteingabe) einlesen für den weiteren Gebrauch.

      Es können auch eigene KeySet dem Programm zugeführt werden. PwKeySetHolder nimmt den Schlüsselsatz als Klartext entgegen, und bewahrt es (während der Laufzeit) für die weitere Verwendung sicher auf.

      Für das Versenden eines Keyset erstellt PwKeySetHolder ein CipherPackage und ein dafür vorgesehenes Passwort, dass z.B. mit dem Diffie-Hellman-Verfahren problemlos übers I-Net weitergereicht werden kann. Es liegt hierzu ein kleines Beispiel vor.


      Verkryptung des KeySet / interner Schlüsselsatz

      PwKeySetHolder verkryptet das KeySet mittel AES. PwKeySetHolder verwendet dazu ein eigener interner Schlüsselsatz, der mit ProtectedData verschlüsselt wird. Sobald ein neuer KeySet generiert bzw. importiert wird erstellt PwKeySetHolder jeweils ein neuer interner Schlüsselsatz für die Verwendung mittels AES. So ist es möglich, dass mit einem kleinen internen Schlüsselsatz ein sehr grosser KeySet (Millionen von Byte) problemlos verschlüsselt und verwaltet werden kann.


      Die Nutzung von PwKeySetHolder sollte eigentlich fast selbsterklärend sein. Hier noch eine kleine Erläuterung.


      Erstellen eines neuen KeySet

      Nach der Instanziierung von PwKeySetHolder kann mit der Methode CreateNewKeySet(PARAMETER) ein neues KeySet erstellt werden. Dazu gibt es mehrere Überladungen, die man sich am Besten kurz anschaut.

      Mit der Methode ToPwKeySet() kann das KeySet wieder als Klartext extrahiert werden.

      VB.NET-Quellcode

      1. Using pks = New PwKeySetHolder
      2. pks.CreateNewKeySet(10, 32, protection)
      3. Dim ks = pks.ToPwKeySet
      4. 'Weiterer Code
      5. End Using



      Verwendung eines eigenen KeySet

      Wer sein eigenes Passwort in PwKeySetHolder einfliessen lassen will, kann das mit der Methode ImportKeySet(PARAMETER) bewerkstelligen. Dazu ist eine Jaggend-Byte-Array vorgesehen.

      Ein Passwort, das als String vorliegt, muss also vorher in eine Jagged-Byte-Array umgewandelt werden.

      VB.NET-Quellcode

      1. 'Passwortlänge min. 10
      2. Dim password = "MyPasswort"
      3. Dim bpassword = Encoding.UTF8.GetBytes(password)
      4. Dim jpassword = New Byte()() _
      5. {
      6. bpassword
      7. }
      8. 'Oder direkt
      9. Dim jpasswrd2 = New Byte()() _
      10. {
      11. Encoding.UTF8.GetBytes(password) 'Klartext
      12. }


      Nun kann das eigene Passwort in PwKeySetHolder eingespielt werden.

      VB.NET-Quellcode

      1. Using pks = New PwKeySetHolder
      2. pks.ImportKeySet(jpassword)
      3. Dim ks = pks.ToPwKeySet
      4. 'Weiterer Code
      5. End Using


      Sicherungspackage eines KeySet

      Um das KeySet sicher von einem Ort zu einem anderen Ort zu übertragen (z.B. übers I-Net), kann man sich ein DispatchData erstellen lassen.

      DispatchData gibt ein verkryptetes CipherPackage aus, wie auch ein Passwort als Klartext. Für die sichere Übertragung eignet sich z.B. das Diffie-Hellman-Verfahren. Hierzu gibt es im Unittest ein Beispiel.

      VB.NET-Quellcode

      1. Using pks = New PwKeySetHolder
      2. 'Generieren eines KeySet
      3. pks.CreateNewKeySet(10, 32, protection)
      4. 'Versendedaten erstellen
      5. Using dispatch = pks.ToDispatchData
      6. 'Versenden über's Internet
      7. '- ChiperData
      8. '- Plain_Password
      9. 'Weiterer Code
      10. End Using
      11. End Using

      VB.NET-Quellcode

      1. ' ... und wieder zurück
      2. Using pks = New PwKeySetHolder
      3. 'DispatchData-Instanz erstellen
      4. Using dispatch = New DispatchData With
      5. {
      6. .Plain_Password = password,
      7. .ChiperData = cipherpackage
      8. }
      9. 'DispatchDaten importieren
      10. pks.ImportDispatchData(dispatch)
      11. 'PlainKeySet extrahieren
      12. Dim ks = pks.ToPwKeySet
      13. End Using
      14. End Using



      Ich hoffe das Problem mit der Hart-Codierung des Passwortes im Code hat sich hiermit erledigt.

      Viel Spass beim Testen

      Freundliche Grüsse

      exc-jdbi


      Anmerkung:

      Obwohl Closed, darf bezugnehmend auf den Code der mit einem IL-Converter jederzeit angeschaut werden kann, für weitere Dialoge im Forum wie Anmerkungen, Vorschläge etc. verwendet werden.

      EDIT:
      Version2: Mit GcHandle und Rfc2898DeriveBytes ist ersetzt worden durch eine HMACSHA512-Variante
      Dateien

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „exc-jdbi“ ()

      exc-jdbi schrieb:

      Ich hoffe das Problem mit der Hart-Codierung des Passwortes im Code hat sich hiermit erledigt.
      Diesen Satz findich ungeheuer spannend und brisant.

      Soll das bedeuten, dass man mit Hilfe PwKeysetHolder zB via Internet sicher auf eine passwortgeschützte Datenbank zugreifen kann? (Es gibt ja Leutz, die sowas tun)
      Da hab ich ja grosse Zweifel, dass PwKeysetHolder das könnte, und vermute eher, der Satz ist anders gemeint.
      Also wie ist der Satz gemeint, und wenn möglich mit nachvollziehbarem Beispiel?
      Hallo @ErfinderDesRades

      Danke für's reinschauen.

      Ja das mit de Hart-Codierung habe ich natürlich anders gemeint. PwKeysetHolder bietet die Möglichkeit das DB-Passwort entgegenzunehmen und abzuspeichern auf die HDD. Ist das Passwort in PwKeysetHolder drin, kann es während der Laufzeit für den ConnectionString problemlos verwendet werden. Statt das Passwort direkt in den ConnectionString zu schreiben, verwendet man einfach eine Variable oder pks.ToPwKeySet().

      Was ganz sicher nicht möglich ist, mit PwKeysetHolder auf geschütze Datenbanken zuzugreifen. Für das ist PwKeysetHolder definitiv nicht gedacht. PwKeysetHolder generiert und vewaltet ein KeySet verschlüsselt während der Laufzeit. Für was anderes ist es nicht gedacht.

      Das mit der Datenbank finde ich noch eine gute Idee. Speziell auf so was habe ich gar nicht hingedacht. Man könnte den KeySet plus die dazugehörenden Cipherdaten natürlich auch in eine Datenbank speichern (oder auch getrennt). Den Umweg über Dispatch würde ich in dem Falle nicht machen, sondern mehr dafür eine eigene serialisierbare Klasse erstellen und die Daten als ByteArray direkt in die Datenbank einspielen lassen. Ob die ByteArray vorgängig verkryptet werden soll, muss der Entwickler oder Db-Nutzer entscheiden ob es notwendig ist.

      Beispiele für das versenden des KeySet übers Internet gibt es sicher (z.B. Chat-Nachrichten etc.). Die Klasse DispatchData habe ich nur vollständigkeitshalber eingebaut, damit der Nutzer von PwKeysetHolder diese Möglichkeit verwenden kann, sofern es gebraucht wird.

      Ich hoffe das beantwortet deine Frage.

      Freundliche Grüsse

      exc-jdbi