CCoder | Definition der CCoder-Klasse |
Coder | Globales CCoder-Objekt |
ChecksumSize | Grösse der Checksumme bei der Funktionen EncodeValueSec |
SaltSize | Länge des Hash-Wertes Salt bei der Funktionen EncodeUnique |
SetPassword | Setzt das Passwort, aus dem der interne Schlüssel für die Verschlüsselung generiert wird. |
EncodeName, DecodeName | Name verschlüsseln bzw. entschlüsseln. |
EncodeValue, DecodeValue | String-Wert verschlüsseln bzw. entschlüsseln. |
EncodeValueSec, DecodeValueSec | String-Wert verschlüsseln bzw. entschlüsseln mit Checksumme |
IsDecodeValueSec | Testet einen mit EncodeValueSec verschlüsselten Text und entschlüsselt ihn, falls seine Checksumme stimmt |
IsValidValueSec | Testet, ob die Checksumme eines verschlüsselten Textes ok ist |
EncodeUnique, DecodeUnique | Unverwechselbare Verschlüsselung von Werten |
IsDecodeUnique | Testet einen mit EncodeUnique verschlüsselten Text und entschlüsselt ihn, falls er nicht manipuliert ist |
EncodeString, DecodeString | String verschlüsseln bzw. entschlüsseln. |
SetCookie, GetCookie | String verschlüsselt in einem Cookie speichern oder vom Cookie abrufen und entschlüsseln. |
GetValidCookie | Testet einen mit SetCookie verschlüsselten Wert und entschlüsselt ihn, falls seine Checksumme stimmt |
SetSession, GetSession | String verschlüsselt in einer Session-Variablen speichern oder von dort abrufen und entschlüsseln. |
GetHash | Erzeugt für einen String einen Hash-Wert beliebiger Länge. |
Der Zugriff auf obige Funktionen kann über das globale Objekt Coder erfolgen:
Return = Coder.Function( Arguments )
Coder.Sub Arguments
class CCoder | |||
ChecksumSize: | integer(>0) | = 3 | Zeichen a 4 Bit |
SaltSize: | integer(>0) | = 4 | Zeichen a 4 Bit |
end class |
Dim Coder
set Coder = new CCoder
Mit dem Includen des Coder-Scripts coder.inc wird auch ein globales Objekt Coder erzeugt. Dadurch entfällt in vielen Anwendungen das explizite Erzeugen und Verwalten eines lokalen Objektes. Es können direkt die Funktionen des globalen Objektes verwendet werden.
Lokal erzeugte CCoder Objekte sind von einander unabhängig und können daher mit einem eigenen Schlüssel versehen werden. Jeder String muss jedoch mit demselben Objekt entschlüsselt werden, mit dem er verschlüsselt worden ist.
CCoder.ChecksumSize: integer(>0); Init = 3; Zeichen a 4 Bit
Bei der Funktion EncodeValueSec wird zusätzlich zum veschlüsselten Text ein sog. Hash-Wert angehängt. Beim Entschlüsseln mit DecodeValueSec wird dieser Hash-Wert überprüft. Passt er nicht zum entschlüsselten Text, ist der verschlüsselte Text ungültig (manipuliert).
Mit den Funktionen IsDecodeValueSec und IsValidValueSec kann überprüft werden, ob ein verschlüsselter Text mit einem gültigen Hash-Wert versehen ist. Ist dies nicht der Fall, ist der Text ungültig und kann nicht decodiert werden.
Coder.ChecksumSize = 4
Vergrössert die Grösse der Checksumme auf 4 mal 4 Bit.
CCoder.SaltSize: integer(>0); Init = 4; Zeichen a 4 Bit
Die Funktion EncodeUnique verknüpft den zu verschlüsselnden String mit einer ID. Der Code kann von der Funktion DecodeUnique nur erfolgreich entschlüsselt werden, wenn dieselbe ID als Parameter übergeben wird.
Aus der ID wird ein Hash-Wert der Länge SaltSize erzeugt, welcher an den String vor dem Verschlüsseln angehängt wird. Diesen Hash-Wert bezeichnet man in der Kryprographie als Salz (engl. Salt). Beim Entschlüsseln wird dieser Hash-Wert wieder entfernt und auf Korrektheit getestet. Stimmt er nicht mit der ID überein, ist der Code manipuliert oder von einer anderen Stelle mit einer anderen ID kopiert worden.
Mit der Funktion IsDecodeUnique kann überprüft werden, ob ein verschlüsselter String mit einer bestimmten ID verknüpft ist. Ist dies nicht der Fall, ist der Code ungültig und kann nicht decodiert werden.
Coder.SaltSize = 6
Vergrössert die Grösse des Salt auf 6 mal 4 Bit = 24 Bit.
CCoder.SetPassword Password
Im globalen Coder-Objekt ist ein Standard-Passwort gesetzt, aus welchem der 128-Bit Schlüssel generiert wird. Mit der Funktion SetPassword kann jedoch ein eigenes Passwort gesetzt werden, aus dem ein neuer 128-Bit Schlüssel generiert wird.
Ein Passwort muss nur einmal ganz am Anfang gesetzt werden. Damit verschlüsselte Strings korrekt entschlüsselt werden können, muss beim Entschlüsseln dasselbe Passwort gesetzt sein, wie zum Zeitpunkt der Verschlüsselung aktiv war.
Coder.SetPassword "MySecurePassword" : encoded = Coder.EncodeString( original, false ) : decoded = Coder.DecodeString( encoded, false )
Return = CCoder.EncodeName( Name )
Return = CCoder.DecodeName( Code )
EncodeName verschlüsselt einen Namen durch Aufruf der Funktion EncodeString mit dem Parameter Randomize = false. Dadurch entsteht für denselben Namen immer ein identischer Code. Dies ist nützlich, um Variablen-Namen z.B. für Eingabefelder, Cookies, Sessions usw. zu verschlüsseln.
DecodeName entschlüsselt einen mit EncodeName verschlüsselten Namen. Damit die Entschlüsselung den ursprünglichen Namen ergibt, muss dasselbe Passwort aktiv sein wie bei der Verschlüsselung des Namen.
Wenn Code kein gültiger mit EncodeName verschlüsselter Name ist, gibt DecodeName einen Leerstring zurück.
Writeln "<input type=""hidden"" name=""" & _ Coder.EncodeName("ID") & """ value=""" & _ Coder.EncodeValueSec(x) & """> : x = Coder.DecodeValueSec( Request( Coder.EncodeName("ID") ) )
Beachte, dass sowohl beim Erzeugen des Input-Elementes in der ersten Zeile, als auch beim Abfragen desselbigen der Name des Elementes mit EncodeName verschlüsselt wird. Dass EncodeName jedesmal denselben Code für denselben Namen erzeugt, ist essentiell.
Return = CCoder.EncodeValue( Text )
Return = CCoder.DecodeValue( Code )
EncodeValue verschlüsselt einen Text durch Aufruf der Funktion EncodeString mit dem Parameter Randomize = true. Dadurch entsteht für denselben Text einer aus 16'384 möglichen Codes. Es ist damit unmöglich, aufgrund des Codes ohne Kenntnis des Schlüssels und des Verschlüsselungsverfahrens auf den Text zu schliessen.
DecodeValue entschlüsselt einen mit EncodeValue verschlüsselten Text. Damit die Entschlüsselung den ursprünglichen Text ergibt, muss dasselbe Passwort aktiv sein wie bei der Verschlüsselung des Textes.
Wenn Code kein gültiger mit EncodeValue verschlüsselter Text ist, gibt DecodeValue einen Leerstring zurück.
Writeln "<input type=""hidden"" name=""ID"" value=""" & _ Coder.EncodeValue(x) & """> : x = Coder.DecodeValue( Request("ID") )
Return = CCoder.EncodeValueSec( Text )
Return = CCoder.DecodeValueSec( Code )
EncodeValueSec verschlüsselt einen Text durch Aufruf der Funktion EncodeValue, erzeugt aber zusätzlich mit Hilfe der Funktion GetHash eine Checksumme, welche an den Text vor dem Verschlüsseln angehängt wird. Die Länge der Checksumme kann mit ChecksumSize eingestellt werden.
Durch das interne Verwenden der Funktion EncodeValue entsteht für denselben Text einer aus 16'384 möglichen Codes. Es ist damit unmöglich, aufgrund des Codes ohne Kenntnis des Schlüssels und des Verschlüsselungsverfahrens auf den Text zu schliessen.
DecodeValueSec entschlüsselt einen mit EncodeValueSec verschlüsselten Text. Damit die Entschlüsselung den ursprünglichen Text ergibt, muss dasselbe Passwort aktiv sein wie bei der Verschlüsselung des Textes. Beim Entschlüsseln des Code wird überprüft, ob die mit in Code gespeicherte Checksumme korrekt ist.
Wenn Code kein gültiger mit EncodeValueSec verschlüsselter Text ist, gibt DecodeValueSec einen Leerstring zurück. Mit den Funktionen IsDecodeValueSec und IsValidValueSec kann überprüft werden, ob die Checksumme von Code korrekt ist und ob Code ein korrekt verschlüsselter Text ist.
Die Funktionen SetCookie und SetSession kodieren ihre Werte intern mit EncodeValueSec. Damit sind in Cookies gespeicherte Werte vor Manipulation und Hacking sicher.
Writeln "<input type=""hidden"" name=""ID"" value=""" & _ Coder.EncodeValueSec(x) & """> : x = Coder.DecodeValueSec( Request("ID") )
Return = CCoder.IsDecodeValueSec( Code, ValueRet )
Falls die Checksumme in Code korrekt ist und Code ein mit EncodeValueSec verschlüsselter Text ist, gibt diese Funktion true zurück und speichert den decodierten Text in ValueRet. Wenn Code nicht korrekt ist, gibt die Funktion false zurück und speichert einen Leerstring in ValueRet.
Writeln "<input type=""hidden"" name=""ID"" value=""" & _ Coder.EncodeValueSec(x) & """> : code = Request("ID") if Coder.IsDecodeValueSec( code, x ) then ' code is ok, x ist entschlüsselter code else ' code is korrupt oder ungültig, x ist "" end if
Return = CCoder.IsValidValueSec( Code )
Falls die Checksumme in Code korrekt ist und Code ein mit EncodeValueSec verschlüsselter Text ist, gibt diese Funktion true zurück. Wenn Code nicht korrekt ist, gibt die Funktion false zurück.
Die Funktion IsDecodeValueSec hat dieselben Funktion wie IsValidValueSec, entschlüsselt aber gleichzeitig den Code. Diese Funktion ruft intern IsDecodeValueSec auf.
Writeln "<input type=""hidden"" name=""ID"" value=""" & _ Coder.EncodeValueSec(x) & """> : code = Request("ID") if Coder.IsValidValueSec( code ) then ' code is ok x = Coder.DecodeValueSec( code ) else ' code is korrupt oder ungültig end if
Return = CCoder.EncodeUnique( ID, Value )
Return = CCoder.DecodeUnique( ID, Code, Default )
EncodeUnique verknüpft den Hash-Wert von ID mit dem String Value und verschlüsselt diese Kombination mit Hilfe der Funktion EncodeValueSec. Der von ID abgeleitete Hash-Wert erhält die Länge SaltSize. Für das Verschlüsseln von Value wird die Funktion EncodeValueSec verwendet, womit der Code mittels einer Checksumme gegen Manipulation geschützt ist.
Das Verknüpfen eines Wertes mit einer ID hat folgende Anwendung:
Angenommen, man hat eine Liste von benannten Objekten A und B, deren Properties man in einer Datei speichern will. Die Objekte sollen je ein Property AccessRight haben. In der Datei steht also für jedes der Objekte A und B der Wert des entsprecheden Properties AccessRight. Ein Hacker könnte nun den Wert des Properties AccessRight des Objektes B zum Property AccessRight des Objektes A kopieren um sich unberechtigten Zutritt zu verschaffen. Da beide Properties korrekt verschlüsselt sind, würde diese Manipulation nicht erkannt werden.
Wenn jedoch der Wert des Properties AccessRight mit dem Objekt-Namen verknüpft wird, kann diese Manipulation beim Entschlüsseln erkannt werden!
DecodeUnique entschlüsselt einen mit EncodeUnique verschlüsselten Wert. Damit die Entschlüsselung den ursprünglichen Wert ergibt, muss dasselbe Passwort aktiv sein wie bei der Verschlüsselung. Beim Entschlüsseln des Code wird überprüft, ob die mit in Code gespeicherte Checksumme korrekt ist und ob der Code mit der ID verknüpft ist.
Wenn Code kein gültiger mit EncodeUnique verschlüsselter Wert ist, gibt DecodeUnique den Wert Default zurück. Mit der Funktion IsDecodeUnique kann überprüft werden, ob die Checksumme von Code korrekt ist und ob Code mit ID verknüpft ist.
for i = 0 to UBound(ObjList) set obj = ObjList(i) WriteLine file, Coder.EncodeValueSec( obj.Name ) WriteLine file, Coder.EncodeUnique( obj.Name, obj.AccessRight ) next : for i = 0 to UBound(ObjList) set obj = ObjList(i) obj.Name = Coder.DecodeValueSec( ReadLine(file) ) obj.AccessRight = Coder.DecodeUnique( obj.Name, ReadLine(file), "none" ) next
Return = CCoder.IsDecodeUnique( ID, Code, ValueRet )
Falls die Checksumme in Code korrekt ist und Code mit ID verknüpft ist, gibt diese Funktion true zurück und speichert den decodierten Wert in ValueRet. Wenn Code nicht korrekt ist, gibt die Funktion false zurück und speichert einen Leerstring in ValueRet.
for i = 0 to UBound(ObjList) set obj = ObjList(i) WriteLine file, Coder.EncodeValueSec( obj.Name ) WriteLine file, Coder.EncodeUnique( obj.Name, obj.AccessRight ) next : for i = 0 to UBound(ObjList) set obj = ObjList(i) obj.Name = Coder.DecodeValueSec( ReadLine(file) ) if not Coder.IsDecodeUnique( obj.Name, ReadLine(file), obj.AccessRight ) then Error "Ungültiger Wert für 'AccessRight' des Objektes " & obj.Name exit sub end if next
Return = CCoder.EncodeString( Text, Randomize )
Return = CCoder.DecodeString( Code, Randomize )
EncodeString Verschlüsselt einen String. Der verwendete Schlüssel wird aus dem Passwort abgeleitet. Wenn Randomize = true ist, wird zudem der Schlüssel noch mit einer Zufallszahl vermischt, sodass selbst derselbe Text jedesmal anders Verschlüsselt wird.
DecodeString Entschlüsselt einen mit EncodeString verschlüsselten Text. Damit die Entschlüsselung den ursprünglichen Text ergibt, muss dasselbe Passwort aktiv sein und Randomize muss denselben Wert haben wie bei der Verschlüsselung.
Wenn Code kein gültiger mit EncodeString verschlüsselter Text ist, gibt DecodeString einen Leerstring zurück.
CCoder.SetCookie CookieName, Name, Value
Return = CCoder.GetCookie( CookieName, Name )
SetCookie speichert einen Wert verschlüsselt mit Checksumme in einem Cookie. Auch der Cookie-Name wird verschlüsselt, sodass selbst bei Zugriff auf das Cookie-File nicht auf die Art der Daten im Cookie geschlossen werden kann!
GetCookie liest einen verschlüsselten Wert aus einem Cookie und entschlüsselt ihn. Wenn der Cookie-Wert nicht korrekt verschlüsselt und mit korrekter Checksumme vorliegt, wird ein Leerstring zurückgegeben.
Return = CCoder.GetValidCookie( CookieName, Name, ValueRet )
GetValidCookie liest einen verschlüsselten Wert aus einem Cookie und entschlüsselt ihn, sofern die Checksumme des Cookie-Wertes ok ist. Wenn der Cookie-Wert nicht korrekt verschlüsselt und mit korrekter Checksumme vorliegt, wird in ValueRet ein Leerstring zurückgegeben. Die Funktion gibt als Funktionwert zurück, ob der Cookie-Wert ein korrekt verschlüsselter Text ist und eine gültige Checksumme enthält.
Coder.SetCookie "MyApp", "Name", "MyName" : if Coder.GetValidCookie( "MyApp", "Name", value ) then ' value ist "MyName" else ' verschlüsselter Wert ist fehlerhaft, value ist "" end if
Mit dem folgenden Aufruf kann bestimmt werden, wie lange ein Cookie auf dem Computer des Browsers gespeichert bleiben soll:
Response.Cookies(CookieName).expires = Now() + days
Wenn days = 0 gesetzt wird, wird das Cookie gelöscht.
CCoder.SetSession Name, Value
Return = CCoder.GetSession( Name )
SetSession speichert einen Wert verschlüsselt mit Checksumme in einer Session-Variablen. Auch der Name der Variablen wird verschlüsselt, sodass selbst bei Zugriff auf das entsprechende Cookie-File, in dem die Session-Informationen abgelegt sind, nicht auf die Art der Daten geschlossen werden kann!
GetSession liest einen verschlüsselten Wert aus einer Session-Variablen ein und entschlüsselt ihn. Wenn der Wert nicht korrekt verschlüsselt ist oder die Checksumme nicht korrekt ist, gibt die Funktion einen Leerstring zurück.
Return = CCoder.GetHash( Text, Size )
Ein Hash-Wert ist eine Art Fingerabdruck für einen Text. Dieser Fingerabdruck kann als Checksumme für einen Text verwendet werden. Für verschiedene Texte kann je nach Länge des Hash-Wertes dieselbe Checksumme entstehen. Mit Hilfe der Checksumme kann recht sicher überprüft werden, ob ein Text dem Original entspricht oder ob er verfälscht wurde.
Die Funktionen EncodeValueSec, SetCookie und SetSession erzeugen eine Checksumme der Länge ChecksumSize mit Hilfe der Funktion GetHash und hängen diese vor dem verschlüsseln an den Text an. Nach dem Entschlüsseln wird die Checksumme vom Text getrennt und mit der für den Text erneut berechneten Checksumme verglichen. Stimmen diese beiden Checksummen nicht überein, ist der verschlüsselte Text korrupt.
Der Hash-Wert wird erzeugt, indem der Text mit EncodeName verschlüsselt wird und davon die letzten Size Zeichen als Hash-Wert bzw. Checksumme verwendet werden. Wenn Text zu kurz ist, um Size Zeichen zu generieren, wird er auf geeignete Weise ergänzt.