von Jan Winkler
Jeder, der Programme selbst entwickelt, kennt das Problem: Datendiebe klauen den Quellcode, an dem man stundenlang gearbeitet hat, und geben ihn als Eigenwerk aus. Diesem Übel kann durch Codierung des Quelltextes abgeholfen werden.
Techniken
Bei der Verschlüsselung von Quelltexten gibt es mehrere Techniken, die von sehr einfach (und ebenso einfach zu entschlüsseln) bis sehr kompliziert reichen. Im folgenden sollen einige vorgestellt werden, wobei zwischen Verschlüsselung des JavaScript-Quelltextes und der Verschlüsselung des gesamten (HTML, CSS, JavaScript …) Quellcodes unterschieden werden sollte.
Je nachdem ist eine Variante eher für das eine beziehungsweise das andere geeignet. Allgemein genommen funktionieren alle Techniken aber nach dem gleichen Prinzip: Der Code wird verschlüsselt in der Datei gespeichert, beim Aufruf der Seite entschlüsselt und in das betreffende Dokument geschrieben. Sieht man sich den Quelltext an, ist es nur der orginal (verschlüsselte) Quelltext und nicht der (entschlüsselte) Code, der angezeigt wird.
Einschränkungen
Da bei jeder Codierung oder Decodierung letztlich ein für den Browser darstellbares Ergebnis entstehen muss, ist es im Grunde unmöglich, den Code so zu verschlüsseln, dass ihn niemand knacken kann. Vielmehr ist es für relativ erfahrene Programmierer relativ leicht, den Code zu enttarnen. Dennoch sollte bedacht werden, dass die meisten Code-Diebe allein vom Anblick scheinbar wirrer Schriftfetzen abgeschreckt werden und die Lust am Kopieren schnell verlieren.
Die Leere-Zeilen Variante
Die einfachste aller Varianten ist das bloße Einfügen von Leerzeilen vor dem gesamten Quelltext. Schaut ein Code-Dieb nach dem Quelltext, wird er mit einer leeren Seite überrascht. Zur Freude des Webdesigners übersehen die meisten Klauer die Scrollbars, die den weiter unten gelegenen Text verbergen:
Verhinderungs-Variante
Diese Möglichkeit ist ebenfalls eine sehr einfache Angelegenheit. Das Ganze basiert darauf, dass dem Dieb der Zugriff auf den Quelltext verwehrt wird. Dazu müssen Sie folgende Dinge tun:
- die rechte Maustaste ausschalten (Kontextmenü)
- die Menüleiste ausblenden bzw. nicht für die eigentliche Datei verwendbar machen
- STRG-Taste verhindern (Short-Cuts)
Die rechte Maustaste wird mit folgendem Script blockiert:
<script language="JavaScript"> <!-- function DoFalse(){alert('Nicht möglich!'); return(false)} if(document.layers) { document.captureEvents(Event.MOUSEDOWN); document.onmousedown=DoFalse(); } //--> </script> [...] <body onMouseDown="return DoFalse();">
Die Menüleiste wird am besten ausgeschaltet bzw. unverwendbar gemacht, indem entweder ein neues Fenster geöffnet wird, welches diese nicht enthält (
window.open(... , ..., 'menubar=false')
if(self == top){window.location.href = 'frameset.htm';};
Um die STRG-Taste auszuschalten, benötigen Sie folgendes Script:
<script language="JavaScript"> <!-- function DoFalse(e) { if((document.all && event.ctrlKey == true) || (document.layers && e.modifiers == 2)) { alert('Nicht möglich!'); return false; } } if(document.layers) { document.captureEvents(Event.KEYPRESS); document.onKeyPress = DoFalse; } //--> </script> [...] <body onMouseDown="return DoFalse();" onKeyPress="return DoFalse();">
Escape-Variante
Eine etwas bessere Variante ist das Verschlüsseln der Sonderzeichen mit Hilfe der
escape
&= %&!§%<>
%26%3D%20%25%26%21%A7%25%3C%3E
Der Quelltext wird zuvor mit dieser Methode verschlüsselt und in einer Variablen gespeichert. So codieren Sie richtig:
alterText = 'abcdefg'; neuerText = escape(alterText);
Beispiel (Formular zum Verschlüsseln)
Die Ausgabe wird wie folgt (ohne weitere darzustellende Elemente) in die Seite eingebunden. Die Variable
versch
<script language="JavaScript"> <!-- var versch = ' .... quelltext ... '; document.open(); document.write(unescape(versch)); document.close(); //--> </script>
Zeichenliste-Variante
Eine weitere Variante ist die Verschlüsselung aller Zeichen mit Hilfe einer Zeichenliste. Dazu wird zuvor ein String angelegt, der alle Zeichen in einer (beliebigen) Reihenfolge enthält. Ausserdem müssen die Sonderzeichen (!, §, $, %, &, /, (, ), =, ?, …) und Steuerzeichen (\n, \t, \r, \b, \f, …) enthalten sein Das Prinzip ist dann wie folgt: Der zu codierende bzw. decodierende String wird von vorn bis hinten durchlaufen. Dabei wird zu jedem Zeichen die Stelle gesucht, an der dieses in der Zeichenliste enthalten ist. Durch eine eingegebene oder vorher gespeicherte Zahl wird die Stelle erhöht und statt dem orginal Zeichen das Zeichen ausgegeben, dass der neuen (erhöhten) Stelle in der Zeichenliste entspricht. Zusätzlich kommt noch das Codieren durch die escape-Variante hinzu. Diese ist unbedingt notwendig, da sonst Fehler auftreten können. Codieren:
var liste = '1234567890ß´`qwertzuiopü+#äölkjhgfds\'ayxcvbnm,.>- <*~_:;|µ!\"§$%&/()=?QWERTZUIOPÜÄÖLKJHGFDSAYXCVBNM@\n\t\r\b\f'; var x = 122; function codieren(s) { res = ''; for(i=0; i<s.length; i++) { a = s.substr(i,1); b = liste.indexOf(a)+x; while(b > liste.length){b = b-liste.length;} res += liste.substr(b,1); } return(escape(res)); }
Beispiel (Formular zum Verschlüsseln)
Bei der Ausgabe wird, anstatt die Stellenzahl zu erhöhen, diese einfach subtrahiert. Der zuvor codierte Quelltext wird wiederum in eine Variable eingebunden. Ausserdem wird eine Geheimzahl abgefragt. Diese bestimmt den Wert, das heisst, um wie viele Stellen ein Zeichen subtrahiert werden soll:
<script language="JavaScript"> <!-- var versch = ' .... quelltext ... '; var liste = '1234567890ß´`qwertzuiopü+#äölkjhgfds\'ayxcvbnm,.>- <*~_:;|µ!\"§$%&/()=?QWERTZUIOPÜÄÖLKJHGFDSAYXCVBNM@\n\t\r\b\f'; function decodieren(s) { s = unescape(s); x = prompt('Bitte Geheimzahl eingeben!'); // = 122 res = ''; for(i=0; i<s.length; i++) { a = s.substr(i,1); b = liste.indexOf(a)-x; while(b < 0){b = b+liste.length;} res += liste.substr(b,1); } return(res); } document.open(); document.write(decodieren(versch)); document.close(); //--> </script>
Neben dem Austausch der Buchstaben durch einfaches Addieren bzw. Subtrahieren gibt es eine Reihe weiterer Möglichkeiten. Fast alle mathematischen oder bitweisen Operatoren können hier zum Einsatz kommen.
Base64 Variante
Eines der bekanntesten Verfahren zum Ver- und Entschlüsseln ist Base64. Es wird unter anderem z.B. bei HTTP-Passwörtern verwendet. Das Grundprinzip ist ähnlich der oben beschriebenen Variante mit Zeichenliste: Mit Hilfe eines Zeichensatzes werden die Buchstaben so verdreht, dass ein neuer String entsteht. Der Vorteil dabei ist, dass die resultierenden Strings meist kürzer als die unverschlüsselten Orginal-Strings sind. Wie folgt wird codiert: (Die erste Zeile enthält einen Zeilenumbruch aus layouttechnischen Gründen, der bei Anwendung entfernt werden muss ).
var base64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(decStr) { var bits; var dual; var i = 0; var encOut = ''; while(decStr.length >= i + 3) { bits = (decStr.charCodeAt(i++) & 0xff) <<16 | (decStr.charCodeAt(i++) & 0xff) <<8 | decStr.charCodeAt(i++) & 0xff; encOut += base64s.charAt((bits & 0x00fc0000) >>18) + base64s.charAt((bits & 0x0003f000) >>12) + base64s.charAt((bits & 0x00000fc0) >> 6) + base64s.charAt((bits & 0x0000003f)); } if(decStr.length -i > 0 && decStr.length -i < 3) { dual = Boolean(decStr.length -i -1); bits = ((decStr.charCodeAt(i++) & 0xff) <<16) | (dual ? (decStr.charCodeAt(i) & 0xff) <<8 : 0); encOut += base64s.charAt((bits & 0x00fc0000) >>18) + base64s.charAt((bits & 0x0003f000) >>12) + (dual ? base64s.charAt((bits & 0x00000fc0) >>6) : '=') + '='; } return(encOut); }
Beispiel (Formular zum Verschlüsseln)
Der codierte String sollte zusätzlich noch mit
escape()
Die erste Zeile enthält einen Zeilenumbruch aus layouttechnischen Gründen, der bei Anwendung entfernt werden muss
var base64s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz0123456789+/'; function decode(encStr) { var bits; var decOut = ''; var i = 0; for(; i<encStr.length; i += 4) { bits = (base64s.indexOf(encStr.charAt(i)) & 0xff) <<18 | (base64s.indexOf(encStr.charAt(i +1)) & 0xff) <<12 | (base64s.indexOf(encStr.charAt(i +2)) & 0xff) << 6 | base64s.indexOf(encStr.charAt(i +3)) & 0xff; decOut += String.fromCharCode((bits & 0xff0000) >>16, (bits & 0xff00) >>8, bits & 0xff); } if(encStr.charCodeAt(i -2) == 61) { return(decOut.substring(0, decOut.length -2)); } else if(encStr.charCodeAt(i -1) == 61) { return(decOut.substring(0, decOut.length -1)); } else {return(decOut)}; }
Software-Varianten
Eine sehr sichere Variante der Verschlüsselung ist die Zuhilfenahme von Software, die speziell dafür ausgelegt ist. Zwei Produkte bieten sich dazu besonders an:
Microsoft Windows Script Encoder
Der Windows Script Encoder von Microsoft ist ein einfaches Befehlszeilen-Tool, das sämtliche Script-Passagen innerhalb eines Dokuments codiert. Vor dem zu codierenden Text wird eine Markierung (//**Start Encode**) angebracht, dann wird der Encoder mit der Befehlszeile
SCRENC [Parameter] Eingabedatei Ausgabedatei
auf MS-DOS-Ebene aufgerufen. Der Encoder verschlüsselt dann automatisch den JavaScript-Quelltext und ändert die Sprachdefinition (aus LANGUAGE=”JScript” wird LANGUAGE=”JScript.Encode”). Der (Microsoft Internet Explorer) Browser weiß dann, dass er zum Ausführen des Quelltextes diesen erst decodieren muss.
Beispiel: Ursprungsdatei Resultatdatei
Netscape Signing Tool
Beim Signing Tool von Netscape handelt es sich um eine Art Compilierung des Quelltextes. Der Quelltext wird dadurch erstens kleiner und zweitens (worauf wir hinaus wollen) unlesbar. Zur Verwendung dessen wird der Text in eine externe Datei ausgelagert, die mit dem Tool compiliert und in das JAR-Format gebracht wird. Innerhalb des Dokumentes wird die Datei mit Hilfe des
ARCHIVE
SCRIPT
Nachteil bei dieser Software-Variante ist, dass jeweils nur der hauseigene Browser der jeweiligen Software-Firma diese Technik beherrschen.
Möglichkeiten zur Verbesserung
Um die Verschlüsselung und damit den Schutz vor Datendiebstahl zu optimieren, bieten sich weitere wirkungsvolle Möglichkeiten an:
- Verschlüsselung der Entschlüsslungsfunktion
eval(unescape( ... mit escape verschlüsselte Funktion zum Entschlüsseln des Codes ... )) - Verwendung anderer (und komplizierterer) mathematischer Operatoren und komplexere Umsetzung der Zeichen
- Verknüpfung mehrerer (verschiedener) Codierungsmethoden miteinander (Verschlüsseltes verschlüsseln, Quelltext verhindern, …)
Nützliche Links
- Microsoft Windows Script Encoder
- Netscape Signing Tool
- Artikel zur MD5 Verschlüsselung mit JavaScript
- Artikel zur Base64 Verschlüsselung mit JavaScript (ursprüngliches Script für die Base64 Variante in diesem Artikel)
- Artikel zur ROT13 Verschlüsselung mit JavaScript
- diverse Artikel zum Thema Passwortschutz (~ Verschlüsselung)
Weitere Beiträge:
- 5 Ideen wie Sie wiederkehrende Arbeitsschritte & Marketingprozesse gewinnbringend im Internet automatisieren! Ein Gastbeitrag von Robert Nabenhauer.
- Wachstum durch Facebook-Gewinnspiele: Wie Sie über Facebook virale Gewinnspiele & eine schnell wachsende Fangemeinde aufbauen
- Wie Sie aufmerksamkeitsstarke Prelaunch-, Launch- und Relaunch-Szenarien aufbauen und dabei Viralität, Spannung & Kaufkraft erzeugen
- Wie Sie waschechte Iphone-Apps mit PhoneGAP entwickeln, um am lukrativen App-Markt mitzumischen
- Wie Sie Ihr Shop-Sortiment so präsentieren, dass der Kunde in Zukunft mehr findet und eher kauft! Ein Gastbeitrag von Nicolas Schmidt-Voigt.
- 11 faszinierende BuddyPress-Plugins, um kostenlos aus WordPress ein soziales Netzwerk zu zaubern
- Die Vorboten einer neuen Internet-Industrie! Ein exklusiver Rückblick & Blick hinter die Kulissen der Clickbank-Exchange 2011 in New York.


Noch keine Kommentare vorhanden!