WaBis

walter.bislins.ch

Coder: Funktionen

Coder : Download | Anwendung | Funktionen
Mit den Coder-Funktionen können Strings, Cookies und Session mit einem 128-Bit Schlüssel sehr einfach ver- und entschlüsselt werden.
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

CCoder

class CCoder
ChecksumSize: integer(>0) = 3 Zeichen a 4 Bit
SaltSize: integer(>0) = 4 Zeichen a 4 Bit
end class

Coder

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.

ChecksumSize

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.

SaltSize

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.

SetPassword

CCoder.SetPassword Password

Password: string
Beliebiger String, aus dem ein Schlüssel generiert wird.

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 )

EncodeName, DecodeName

Return = CCoder.EncodeName( Name )
Return = CCoder.DecodeName( Code )

Name: string
Zu verschlüsselnder Name
Code: string
Verschlüsselter Name
Return: string
Ver- bzw. Entschlüsselter Name

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.

EncodeValue, DecodeValue

Return = CCoder.EncodeValue( Text )
Return = CCoder.DecodeValue( Code )

Text: string
Zu verschlüsselnder Text
Code: string
Verschlüsselter Text
Return: string
Ver- bzw. Entschlüsselter Text

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") )

EncodeValueSec, DecodeValueSec

Return = CCoder.EncodeValueSec( Text )
Return = CCoder.DecodeValueSec( Code )

Text: string
Zu verschlüsselnder Text
Code: string
Verschlüsselter Text
Return: string
Ver- bzw. Entschlüsselter Text

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") )

IsDecodeValueSec

Return = CCoder.IsDecodeValueSec( Code, ValueRet )

Code: string
mit EncodeValueSec Verschlüsselter Text
ValueRet: string byRef
entschlüsselter Text oder Leerstring, falls Code ungültig ist
Return: bool
true, wenn Code ein gültiger verschlüsselter Text ist (Checksumme ist ok)

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

IsValidValueSec

Return = CCoder.IsValidValueSec( Code )

Code: string
mit EncodeValueSec Verschlüsselter Text
Return: bool
true, wenn Code ein gültiger verschlüsselter Text ist (Checksumme ist ok)

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

EncodeUnique, DecodeUnique

Return = CCoder.EncodeUnique( ID, Value )
Return = CCoder.DecodeUnique( ID, Code, Default )

ID: string
Value wird mit dieser ID verknüpft
Value: string
Zu verschlüsselnder String
Code: string
Verschlüsselter String
Default: string
Wert, der zurückgegeben wird, wenn die Entschlüsselung nicht erfolgreich ist
Return: string
Ver- bzw. Entschlüsselter String

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

IsDecodeUnique

Return = CCoder.IsDecodeUnique( ID, Code, ValueRet )

ID: string
ID, mit welcher Code verknüpft sein soll
Code: string
mit EncodeUnique Verschlüsselter Wert
ValueRet: string byRef
entschlüsselter Wert oder Leerstring, falls Code ungültig ist
Return: bool
true, wenn Code ein gültiger verschlüsselter Wert ist (Checksumme und ID ok)

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

EncodeString, DecodeString

Return = CCoder.EncodeString( Text, Randomize )
Return = CCoder.DecodeString( Code, Randomize )

Text: string
Zu verschlüsselnder Klartext
Code: string
Verschlüsselter Text
Randomize: bool
siehe Randomisierung der Verschlüsselung
Return: string
Ver- bzw. Entschlüsselter Text

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.

SetCookie, GetCookie

CCoder.SetCookie CookieName, Name, Value
Return = CCoder.GetCookie( CookieName, Name )

CookieName: string
Name eines Cookies. Alle Name/Value-Paare mit dem selben Cookie-Namen werden im gleichen Cookie-File auf dem Computer des Browsers abgespeichert.
Name: string
Name einer Cookie-Variablen.
Value, Return: string
Wert der Cookie-Variablen.

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.

GetValidCookie

Return = CCoder.GetValidCookie( CookieName, Name, ValueRet )

CookieName: string
Name eines Cookies. Alle Name/Value-Paare mit dem selben Cookie-Namen werden im gleichen Cookie-File auf dem Computer des Browsers abgespeichert.
Name: string
Name einer Cookie-Variablen.
ValueRet: string byRef
Wert der Cookie-Variablen, falls die Checksumme ok ist, sonst Leerstring
Return: bool
true wenn der verschlüsselte Cookie-Wert eine korrekte Checksumme hat

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

Gültigkeit eines Cookies

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.

SetSession, GetSession

CCoder.SetSession Name, Value
Return = CCoder.GetSession( Name )

Name: string
Name einer Session-Variablen.
Value, Return: string
Wert der Session-Variablen.

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.

GetHash

Return = CCoder.GetHash( Text, Size )

Text: string
Text für welchen ein Hash-Wert erzeugt werden soll
Size: integer(>0)
Länge des Hash-Wertes
Return: string
Hash-Wert der Länge Size für den String Text

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.

Weitere Infos zur Seite
Erzeugt Mittwoch, 18. August 2010
von wabis
Zum Seitenanfang
Geändert Sonntag, 6. Dezember 2015
von wabis