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 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
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
SecureObject(Of T) gibt mit
SecureObject(Of T) besitz auch eine eigene
Mit
Eine Wichtigkeit muss noch gesagt werden. Wird SecureObject(Of T)
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
Ein Beispiel findet man im Anhang.
Static/Shared Methoden
Die Static/Shared Methoden sind selbsterklärend.
Spoiler anzeigen
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.
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.
VB.NET-Quellcode
- Dim plain = "My Secrettext ..."
- Dim plainsize = plain.Length
- Dim bplain = Encoding.UTF8.GetBytes(plain)
- Using secureobj = New SecureObject(Of String)
- '**** **** **** **** **** **** **** **** ****
- 'WICHTIG: String sind nicht gerne gesehen, in
- 'Arbeiten des Securebereiches !!!!!!!!
- ' >> Besser statt String GENERELL mit Bytes
- ' arbeiten.
- '**** **** **** **** **** **** **** **** ****
- 'Gewünschter String eingeben
- secureobj.InitNew(plain)
- 'Um den String aus dem Securebereich zu extrahieren
- Dim decipher = secureobj.ToObject
- 'Kurze Prüfung ob beide "Strings" gleich sind.
- If Not secureobj.ToObject.SequenceEqual(plain) Then Stop
- 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.
VB.NET-Quellcode
- Using secureobj = New SecureObject(Of Byte())
- '**** **** **** **** **** **** **** **** **** **** ****
- 'Byte-Arrays Eingang besitzen eine generisch spezialisierte
- 'Methode, mit dem Zusatzparameter '_nothingplain'
- 'Die Byte-Array kann also gleich wieder zurückgesetzt
- 'werden auf Nothing, sofern erwünscht.
- '**** **** **** **** **** **** **** **** **** **** ****
- 'Gewünschtes Byte-Array eingeben
- 'False >> ohne Array-Rücksetzung
- secureobj.InitNew(bplain, False)
- 'Die Byte-Array aus dem Securebereich extrahieren
- 'Dim decipher = secureobj.ToObject
- 'Kurze Prüfung ob beide Byte-Arrays gleich sind.
- If Not secureobj.ToObject.SequenceEqual(bplain) Then Stop
- 'Eine Kopie von SecureObject(Of T)
- Dim copyso = secureobj.Copy
- 'Beide SecureObject(Of T) auf Gleichheit prüfen
- If Not secureobj.Equals(copyso) Then Stop
- 'WICHTIG: Nach Clear kann SecureObject(Of T) weiterhin
- ' verwendet werden.
- ' (Typengleichheit muss beachtet werden)
- secureobj.Clear()
- 'Prüfen ob SecureObject(Of T) schon besetzt ist
- If secureobj.IsBusy Then Stop
- 'Gewünschtes Byte-Array eingeben
- secureobj.InitNew(bplain, False)
- If Not secureobj.Equals(copyso) Then Stop
- 'WICHTIG: Nach dem Disposen ist es nicht mehr
- ' möglich mit SecureObject zu arbeiten
- ' >> copyso.IsDisposed = False
- copyso.Dispose()
- 'Prüfen ob 'copyso' Disposed
- If Not copyso.IsDisposed Then Stop
- 'Da 'copyso' Disposed wird ein False zurückgegeben
- If secureobj.Equals(copyso) Then Stop
- 'Idealerweise immer auf Nothing setzen
- copyso = Nothing
- 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.
VB.NET-Quellcode
- <Serializable>
- Public Class Person
- Public FirstName As String
- Public LastName As String
- Public Occupation As String
- Public Born As DateTime
- <NonSerialized>
- Public Age As Int32
- Public Shared Function CalcAge(birthdate As DateTime) As Int32
- Dim today = DateTime.Today
- Dim age = today.Year - birthdate.Year
- Return If(birthdate.Date > today.AddYears(-age), age - 1, age)
- End Function
- Public Shared Sub SetAge(ByRef _person As Person)
- If _person Is Nothing Then Return
- _person.Age = CalcAge(_person.Born)
- End Sub
- Public Shared Sub SetAge(ByRef persons() As Person)
- If persons Is Nothing Then Return
- If persons.Length < 1 Then Return
- For i As Int32 = 0 To persons.Length - 1
- SetAge(persons(i))
- Next
- End Sub
- End Class
Ein Beispiel findet man im Anhang.
Static/Shared Methoden
Die Static/Shared Methoden sind selbsterklärend.
VB.NET-Quellcode
- 'Gewünschte Anzahl
- Dim size As Int32 = 25
- 'Eine Anzahl Random-Char (UniCode) in einer Char-Array
- Dim rngchar = SecureObject.GetRngChar(size)
- 'Eine Anzahl Random-Char vom Alphabet in einer Char-Array
- Dim rngalphachar = SecureObject.GetRndAlpha(size)
- 'Eine Anzahl Random-Char (UniCode) in einer Byte-Array UTF8
- Dim rngcharbytes = SecureObject.GetRngCharBytesU8(size)
- 'Eine Anzahl Random-Char (UniCode) in einer Byte-Array UTF8
- 'wobei sich 'size' auf die Byteanzahl bezieht
- Dim rngcharbytesfix = SecureObject.GetRngCharBytesU8Fix(size)
- 'Binäre-Serialisierung
- Dim seribin = SecureObject.SerializeBinary(rngcharbytes)
- 'Binäre-Deserialisierung
- Dim deseribin = SecureObject.DeserializeBinary(Of Byte())(seribin)
- 'Eine Anzahl Random-Bytes (ohne 0)
- 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.
Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „exc-jdbi“ ()