Codieren und Verschlüsseln mit JavaScript

Werbung

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:

Beispiel

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

Beispiel

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>

Beispiel

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>

Beispiel

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)}; }

Beispiel

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:

Über Gastautor

DrWeb.de ist die "Grande Dame" des deutschen Bloggings und seit nunmehr 14 Jahren im Internet aktiv. Das beliebte Magazin richtet sich dabei an Webworker, Selbstständige, IT-Entscheider, Seitenbetreiber sowie Marketing-Verantwortliche und bietet einen Überblick im undurchdringlichen Dschungel zahlreicher "Geld verdienen im Internet" Konzepte. Werden Sie jetzt Gastautor und profitieren Sie von der großen Reichweite und den Markennamen DrWeb.de.

,

Noch keine Kommentare vorhanden!

Hinterlasse eine Antwort

Bitte bei weiteren Kommentaren per Email benarichtigen! Auch möglich: Abo ohne Kommentar.

Spam protection by WP Captcha-Free