SecureObject(T)

    • VB.NET
    • .NET (FX) 4.0

      SecureObject(T)

      Hallo Community

      Habt Ihr euch auch schon gewünscht, dass es eine Art "SecureString" gibt, die allgemein für alle Objekte nutzbar ist? Ich habe gerade vor kurzem ein Projekt abgeschlossen, da wäre ich froh gewesen.

      Darum habe ich mir jetzt selber eins geschrieben. Es nennt sich SecureObject. Der Name sagt es selber schon. Egal was während der Laufzeit geschützt werden muss, SecureObject bietet Performance, Sicherheit und Einfachheit.

      SecureObject besteht aus
      - Klasse SecureObject(Of T)
      - Partial Klasse SecureObject (Static/Shared)
      - Klasse SOCR (Random Int32 RNGCryptoServiceProvider Static/Shared)


      Strings

      Strings werden wie ganz normale Objekte behandelt, und über die generische Methode in SecureObject(Of T) eingereicht.
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Dim plain = "My Secrettext ..."
      2. Dim plainsize = plain.Length
      3. Dim bplain = Encoding.UTF8.GetBytes(plain)
      4. Using secureobj = New SecureObject(Of String)
      5. '**** **** **** **** **** **** **** **** ****
      6. 'WICHTIG: String sind nicht gerne gesehen, in
      7. 'Arbeiten des Securebereiches !!!!!!!!
      8. ' >> Besser statt String GENERELL mit Bytes
      9. ' arbeiten.
      10. '**** **** **** **** **** **** **** **** ****
      11. 'Gewünschter String eingeben
      12. secureobj.InitNew(plain)
      13. 'Um den String aus dem Securebereich zu extrahieren
      14. Dim decipher = secureobj.ToObject
      15. 'Kurze Prüfung ob beide "Strings" gleich sind.
      16. If Not secureobj.ToObject.SequenceEqual(plain) Then Stop
      17. End Using



      Bytes Array (Sonderstellung)

      Für Arrays mit Byte bietet SecureObject(Of T) eine spezialisierte Methode als Eingang. Eigentlich nichts besonderes ausser, dass die spezialisierte Methode noch einen Optional-Parameter besitzt, der auf True gesetzt werden kann, sofern die Byte-Array gleich auch zurückgesetzt werden soll. Alle anderen Datentypen können nur über die generische Methode in SecureObject(Of T) eingegeben werden.
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Using secureobj = New SecureObject(Of Byte())
      2. '**** **** **** **** **** **** **** **** **** **** ****
      3. 'Byte-Arrays Eingang besitzen eine generisch spezialisierte
      4. 'Methode, mit dem Zusatzparameter '_nothingplain'
      5. 'Die Byte-Array kann also gleich wieder zurückgesetzt
      6. 'werden auf Nothing, sofern erwünscht.
      7. '**** **** **** **** **** **** **** **** **** **** ****
      8. 'Gewünschtes Byte-Array eingeben
      9. 'False >> ohne Array-Rücksetzung
      10. secureobj.InitNew(bplain, False)
      11. 'Die Byte-Array aus dem Securebereich extrahieren
      12. 'Dim decipher = secureobj.ToObject
      13. 'Kurze Prüfung ob beide Byte-Arrays gleich sind.
      14. If Not secureobj.ToObject.SequenceEqual(bplain) Then Stop
      15. 'Eine Kopie von SecureObject(Of T)
      16. Dim copyso = secureobj.Copy
      17. 'Beide SecureObject(Of T) auf Gleichheit prüfen
      18. If Not secureobj.Equals(copyso) Then Stop
      19. 'WICHTIG: Nach Clear kann SecureObject(Of T) weiterhin
      20. ' verwendet werden.
      21. ' (Typengleichheit muss beachtet werden)
      22. secureobj.Clear()
      23. 'Prüfen ob SecureObject(Of T) schon besetzt ist
      24. If secureobj.IsBusy Then Stop
      25. 'Gewünschtes Byte-Array eingeben
      26. secureobj.InitNew(bplain, False)
      27. If Not secureobj.Equals(copyso) Then Stop
      28. 'WICHTIG: Nach dem Disposen ist es nicht mehr
      29. ' möglich mit SecureObject zu arbeiten
      30. ' >> copyso.IsDisposed = False
      31. copyso.Dispose()
      32. 'Prüfen ob 'copyso' Disposed
      33. If Not copyso.IsDisposed Then Stop
      34. 'Da 'copyso' Disposed wird ein False zurückgegeben
      35. If secureobj.Equals(copyso) Then Stop
      36. 'Idealerweise immer auf Nothing setzen
      37. copyso = Nothing
      38. End Using

      SecureObject(Of T) gibt mit Copy eine exakte Kopie gleichen Inhaltes, jedoch mit komplett anderen Verschlüsselungsparameter. SecureObject(Of T) nutzt immer mehrere zufällig erstellte Keys, um das entsprechende Objekt das geschützt werden will zu verkrypten.

      SecureObject(Of T) besitz auch eine eigene Equals-Methode, die prüft ob 2 SecureObject(Of T)-Inhalte gleich sind.

      Mit Clear werden alle essentielle Ressourcen zurückgesetzt, um den Anfangsstatus sicherzustellen. Mit IsBusy und IsDisposed kann jederzeit während der Laufzeit geprüft werden wie der momentane Status ist.

      Eine Wichtigkeit muss noch gesagt werden. Wird SecureObject(Of T) disposed, so ist es nicht mehr nutzbar (ausser Static/Shared Methoden). Eine weitere Sache die gleich auffällt sind die Variablen in den Methoden. Nebst Deklaration und Initialisierung, werden sie nach Gebrauch gleich "händisch" korrekt wieder zurückgesetzt. Eine Massnahme, die ich mir von Anfang an für SecureObject(Of T) vorgenommen und durchgezogen habe.



      Klassen


      Auch Klasseninstanzen können eingereicht werden, die entsprechenden Klassen müssen jedoch serialisierbar sein. Eine wichtige Voraussetzung um mit SecureObject(Of T) zu arbeiten.
      Spoiler anzeigen

      VB.NET-Quellcode

      1. <Serializable>
      2. Public Class Person
      3. Public FirstName As String
      4. Public LastName As String
      5. Public Occupation As String
      6. Public Born As DateTime
      7. <NonSerialized>
      8. Public Age As Int32
      9. Public Shared Function CalcAge(birthdate As DateTime) As Int32
      10. Dim today = DateTime.Today
      11. Dim age = today.Year - birthdate.Year
      12. Return If(birthdate.Date > today.AddYears(-age), age - 1, age)
      13. End Function
      14. Public Shared Sub SetAge(ByRef _person As Person)
      15. If _person Is Nothing Then Return
      16. _person.Age = CalcAge(_person.Born)
      17. End Sub
      18. Public Shared Sub SetAge(ByRef persons() As Person)
      19. If persons Is Nothing Then Return
      20. If persons.Length < 1 Then Return
      21. For i As Int32 = 0 To persons.Length - 1
      22. SetAge(persons(i))
      23. Next
      24. End Sub
      25. End Class

      Ein Beispiel findet man im Anhang.



      Static/Shared Methoden


      Die Static/Shared Methoden sind selbsterklärend.
      Spoiler anzeigen

      VB.NET-Quellcode

      1. 'Gewünschte Anzahl
      2. Dim size As Int32 = 25
      3. 'Eine Anzahl Random-Char (UniCode) in einer Char-Array
      4. Dim rngchar = SecureObject.GetRngChar(size)
      5. 'Eine Anzahl Random-Char vom Alphabet in einer Char-Array
      6. Dim rngalphachar = SecureObject.GetRndAlpha(size)
      7. 'Eine Anzahl Random-Char (UniCode) in einer Byte-Array UTF8
      8. Dim rngcharbytes = SecureObject.GetRngCharBytesU8(size)
      9. 'Eine Anzahl Random-Char (UniCode) in einer Byte-Array UTF8
      10. 'wobei sich 'size' auf die Byteanzahl bezieht
      11. Dim rngcharbytesfix = SecureObject.GetRngCharBytesU8Fix(size)
      12. 'Binäre-Serialisierung
      13. Dim seribin = SecureObject.SerializeBinary(rngcharbytes)
      14. 'Binäre-Deserialisierung
      15. Dim deseribin = SecureObject.DeserializeBinary(Of Byte())(seribin)
      16. 'Eine Anzahl Random-Bytes (ohne 0)
      17. Dim rngbytes = SecureObject.RandomKey(size)



      EDIT:
      Version 3 nur noch als Binary mit UnitTestCode erhältlich.

      Freundliche Grüsse

      exc-jdbi

      Im Anhang werden die Beispiele nochmals gezeigt. Vorläufig nur als Binaries. Wenn der Bedarf da ist, werde ich zu einem späteren Zeitpunkt auch die Source reinhängen.

      Das Projekt insbesondere die Konzeption ist noch nicht abgeschlossen. Es kann durchaus sein, dass ich in einer weiteren Version etwas ganz neues vorstelle.
      Dateien

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