27.4 Code codieren
Wenn der JavaScript-Code schon einsehbar ist, können Sie wenigstens dafür sorgen, dass nur Sie ihn verstehen und niemand sonst. Natürlich gibt es Programmierer, die von vornherein so programmieren, dass nur sie noch durch ihren Code durchblicken, aber das wollen wir hier nicht annehmen.
27.4.1 Optisch verschleiern
Wenn Sie also schönen Code vorliegen haben, können Sie wie folgt vorgehen, um es Datendieben ein wenig schwerer zu machen, den Code zu verstehen und einzubinden:
|
Entfernen Sie alle Kommentare. |
|
Benennen Sie Variablen um. Eine Variable zaehler könnten Sie beispielsweise in FensterReferenz, gurken oder xlbrmf umbenennen. Aber passen Sie auf, dass Sie nicht selbst die Übersicht verlieren! |
|
Entfernen Sie alle Einrückungen und andere Hilfsmittel wie beispielsweise Leerzeilen, die den Code lesbar mach(t)en. |
|
Verzichten Sie möglichst auf Zeilensprünge. Mit ausreichend geschweiften Klammern und Strichpunkten lässt sich der gesamte Code in einer Zeile platzieren. |
|
Verwenden Sie ein wirres Sammelsurium aus mehreren .js-Dateien, die Sie einbinden. |
|
Fügen Sie unsinnige Funktionen und Variablen ein, die gar nicht verwendet werden (aber dafür fast genauso heißen wie tatsächlich verwendete Variablen und Funktionen). |
Das waren natürlich nur ein paar Beispiele, in der Praxis sind Ihrer Fantasie kaum Grenzen gesetzt. Sie sollten aber auf jeden Fall eine Sicherheitskopie Ihrer Originalskripten behalten, um im Notfall noch eine funktionierende Kopie Ihres Codes vorliegen zu haben.
27.4.2 Inhaltlich verschleiern
Trotz aller Tricks, den Code umzustellen und hässlich zu machen, sind die Befehle immer noch im Klartext vorhanden. Was spricht also gegen eine Verschlüsselung?
Es gibt hierzu mehrere Ansätze, und wir werden einen recht einfachen davon vorstellen. Der Trick besteht darin, den Code entsprechend umzuwandeln. Schreiben Sie dazu zunächst den notwendigen Code in eine Zeile:
function hallo() { document.write("Hallo!"); } hallo();
Nun geht es darum, obigen Code geeignet zu verschlüsseln. Die einfachste Möglichkeit besteht darin, alle Buchstaben umzuwandeln, beispielsweise indem Sie im Alphabet eine gewisse Anzahl von Zeichen voranschreiten.
Dazu benötigen Sie den ISO-Code des entsprechenden Zeichens. Wir wollen uns hier nur auf Buchstaben beschränken:
|
a hat den Zeichencode 97. |
|
z hat den Zeichencode 122. |
|
A hat den Zeichencode 65. |
|
Z hat den Zeichencode 90. |
Die folgende Funktion verschlüsselt eine Zeichenkette:
|
Zunächst wird der Zeichencode jedes einzelnen Zeichens bestimmt. Dazu steht die Funktion charCodeAt() zur Verfügung. |
|
Ist das Zeichen ein Buchstabe (Code zwischen 97 und 122 oder zwischen 65 und 90), so wird eine bestimmte Zahl hinzugezählt. Damit der Code etwas schöner wird, achten wir darauf, dass am Ende trotzdem noch ein Buchstabe herauskommt. |
Hier ein exemplarisches Beispiel: Das Z hat den Zeichencode 90. Wenn man drei dazuzählt, erhält man 93, dieser Code ergibt aber keinen Buchstaben. Aus diesem Grund beginnen wir bei den Zeichen wieder von vorn. Das Zeichen nach dem Z ist also das A; drei Zeichen nach dem Z kommt wieder das C.1
|
Die Funktion fromCharCode()wandelt den Zeichencode wieder in ein Zeichen um. |
|
Der erzeugte String wird von der Funktion wieder zurückgegeben. |
Die Funktion sieht wie folgt aus:
function codeschutz_encode(s, delta) {
var temp = "";
var alt, neu;
for (var i=0; i<s.length; i++) {
alt = s.charCodeAt(i);
if (alt >= 65 && alt <= 90) {
neu = alt + delta;
if (neu > 90) {
neu -= 26;
}
} else if (alt >= 97 && alt <= 122) {
neu = alt + delta;
if (neu > 122) {
neu -= 26;
}
} else {
neu = alt;
}
temp += String.fromCharCode(neu);
}
return temp;
}
Der Aufruf
codeschutz_encode("function hallo() { document.write(\"Hallo!\"); } hallo();", 13)
liefert folgendes Ergebnis:
shapgvba unyyb() { qbphzrag.jevgr("Unyyb!"); } unyyb();
Das ist schon etwas kryptischer als zuvor. Zur Decodierung muss der Algorithmus nur noch rückwärts durchlaufen werden, das heißt, der Delta-Wert muss rückwärts durchlaufen werden:
function codeschutz_decode(s, delta) {
var temp = "";
var alt, neu;
for (var i=0; i<s.length; i++) {
alt = s.charCodeAt(i);
if (alt >= 65 && alt <= 90) {
neu = alt – delta;
if (neu < 65) {
neu += 26;
}
} else if (alt >= 97 && alt <= 122) {
neu = alt – delta;
if (neu < 97) {
neu += 26;
}
} else {
neu = alt;
}
temp += String.fromCharCode(neu);
}
return temp;
}
Der folgende Code würde also das verschlüsselte Listing ausführen:
var code = codeschutz_decode("shapgvba unyyb() { qbphzrag.jevgr(\"Unyyb!\"); } unyyb(); ");
eval(code);
Achten Sie darauf, im codierten Code Anführungszeichen entsprechend mit \ zu entwerten.
Das folgende Listing hilft Ihnen dabei, Ihren JavaScript-Code entsprechend zu codieren (unter der Prämisse, dass die beiden vorgenannten Hilfsfunktionen in der Datei codeschutz.js stehen). In ein Texteingabefeld geben Sie den Code ein, und auf Knopfdruck wird die kryptische Zeichenkette in einem <textarea>-Element ausgegeben. Der Code wird hier ohne weitere Erklärung wiedergegeben. Er ist nicht sonderlich kompliziert.
<html>
<head>
<title>Code verschlüsseln</title>
<script type="text/javascript" src="codeschutz.js"></script>
<script type="text/javascript"><!--
function encode(f) {
var eingabe = f.elements["eingabe"].value;
var delta = parseInt(f.elements["delta"].value);
var ausgabe = codeschutz_encode(eingabe, delta);
f.elements["ausgabe"].value = ausgabe;
}
//--></script>
</head>
<body>
<form onsubmit="return false;">
<textarea name="eingabe" cols="70" rows="10">
</textarea><br />
<input type="text" name="delta" value="13" />
<input type="button" value="Kodieren"
onclick="encode(this.form);" />
<textarea name="ausgabe" cols="70" rows="10"
onfocus="this.blur();">
</textarea>
</form>
</body>
</html>
Hier klicken, um das Bild zu Vergrößern
Abbildung 27.6 Der JavaScript-Code (oben) wurde verschlüsselt (unten).
Sie müssen aber nicht einmal selbst in die Tasten greifen, um Ihren Code zu verschlüsseln. Es gibt im Web eine Reihe von Freeware- und Shareware-Tools, die eine Codeverschlüsselung vornehmen können. Diese Produkte codieren zumeist den kompletten HTML-Code.
Die Seite besteht dann aus einer Menge JavaScript-Code, der (mithilfe von document.write()) die eigentliche HTML-Seite erstellt. Der große Nachteil solcher Programme ist folgender: Wenn der Browser kein JavaScript unterstützt, sieht er natürlich überhaupt nichts. Sie sollten ein solches Mittel also nur sehr bedacht einsetzen. Außerdem kann Ihren Bemühungen ein Uralt-Browser wie der Netscape Navigator 4 einen Strich durch die Rechnung machen. Unter Umständen zeigt diese Version nämlich bei der Verwendung von document.write() den erzeugten Code an, nicht aber den JavaScript-Code.
Durch die Eingabe der Suchbegriffe »html encrypt« bei einschlägigen Download-Angeboten wie etwa http://www.download.com/ erhalten Sie eine Übersicht über potenzielle Hilfsmittel. Bekannte Vertreter sind das englischsprachige Webcrypt Pro (http://www.moonlight-software .com/webcrypt.htm) und das aus deutscher Schmiede stammende HTML Guard (http://www.aw-soft.de/htmlguard.html).
Dieses Vorgehen bietet wohl die mit am besten funktionierende Verschlüsselung von Code, weist aber zwei Nachteile auf:
|
Das Updaten von Code wird schwieriger, da Sie immer wieder die Umwandlung vornehmen müssen. |
|
An irgendeiner Stelle wird document.write() und/oder eval() aufgerufen. Ein versierter JavaScript-Programmierer kann an dieser Stelle eingreifen und sich den auszuführenden Code ausgeben lassen. |
|