Schutz des Java-Quellcodes vor dem Zugriff [geschlossen]


96

Letzte Woche musste ich eine kleine GUI für Hausaufgaben erstellen. Keiner meiner Schulkameraden hat es getan. Sie haben meine gestohlen, von wo wir sie hochladen mussten, und dann haben sie sie erneut als ihre hochgeladen. Als ich meinem Lehrer sagte, es sei meine ganze Arbeit, glaubte er mir nicht.

Also dachte ich daran, eine nutzlose Methode oder etwas mit dem Beweis, dass ich sie codiert habe, in mich aufzunehmen. Ich dachte an Verschlüsselung. Meine bisher beste Idee:

String key = ("ZGV2ZWxvcGVkIGJ5IFdhckdvZE5U"); //My proof in base64

Können Sie sich andere bessere Möglichkeiten vorstellen?


31
Hatten die Dateien keinen Zeitstempel auf der Upload-Site?
Averroes

76
Wollen Sie damit sagen, dass sie Ihren Code von der Stelle herunterladen könnten, an der Sie ihn hochgeladen haben? Das scheint verrückt zu sein. Sie sollten die Methoden des Lehrers hinterfragen. Am besten durch ein Gespräch mit seinem / ihrem Chef, da er / sie etwas unvernünftig zu sein scheint.
Keyser

56
Epic scheitert an einer Ihrer Hausaufgaben und lässt die ganze Klasse scheitern.
gehalten am

25
Scheint, als wäre der Lehrer auch ein Anfänger ...
UmNyobe

22
In dieser Situation ist es nur sinnvoll, das Problem zu beheben, indem Sie mit dem Lehrer darüber sprechen, wie Sie Ihre Hausaufgaben hochladen. Das Hochladen in einen Bereich, in dem Sie die Beiträge aller anderen herunterladen können, ist einfach nur dumm - ich bin mir nicht sicher, ob ein Lehrer, der diesen Ansatz für gut hält, wirklich unterrichten sollte!
Michael Berry

Antworten:


104

Ich hatte vor langer Zeit das gleiche Problem wie Sie. Wir hatten Windows 2000-Computer und haben Dateien in einen neuartigen Netzwerkordner hochgeladen, den jeder sehen konnte. Ich habe verschiedene Tricks angewendet, um selbst die besten Diebe zu besiegen: Whitespace-Wasserzeichen; Metadaten-Wasserzeichen; ungewöhnliche Charaktere; vertrauenswürdige Zeitstempelung; Modus Operandi. Hier sind sie in Ordnung.

Whitespace-Wasserzeichen:

Dies ist mein ursprünglicher Beitrag zum Wasserzeichen. Ich brauchte ein unsichtbares Wasserzeichen, das in Textdateien funktionierte. Der Trick, den ich mir ausgedacht habe, bestand darin, ein bestimmtes Leerzeichenmuster zwischen Programmieranweisungen (oder Absätzen) einzufügen. Die Datei sah für sie gleich aus: einige Programmieranweisungen und Zeilenumbrüche. Wenn Sie den Text sorgfältig auswählen, wird das Leerzeichen angezeigt. Jede leere Zeile würde eine bestimmte Anzahl von Leerzeichen enthalten, die offensichtlich nicht zufällig oder zufällig sind. (zB 17) In der Praxis hat diese Methode die Arbeit für mich erledigt, weil sie nicht herausfinden konnten, was ich in die Dokumente eingebettet habe.

Metadaten-Wasserzeichen

Hier ändern Sie die Metadaten der Datei, um Informationen zu enthalten. Sie können Ihren Namen, einen Hash usw. in unsichtbare Teile einer Datei einbetten, insbesondere in EXE-Dateien. In NT-Tagen waren alternative Datenströme beliebt.

Ungewöhnliche Charaktere

Ich werde diesen nur zum Spaß reinwerfen. Ein alter IRC-Identitätswechsel-Trick bestand darin, einen Namen mit Buchstaben zu erstellen, die dem Namen einer anderen Person ähneln. Sie können dies als Wasserzeichen verwenden. Die Zeichentabelle in Windows enthält viele ungewöhnliche Zeichen, die einem Buchstaben oder einer Zahl ähneln, aber nicht sind, die Sie möglicherweise in Ihrem Quellcode verwenden. Diese, die an einer bestimmten Stelle in der Arbeit eines anderen auftauchen, können nicht zufällig sein.

Vertrauenswürdige Zeitstempelung

Kurz gesagt, Sie senden eine Datei (oder ihren Hash) an einen Dritten, der ihm dann einen Zeitstempel anfügt und ihn mit einem privaten Schlüssel signiert. Jeder, der nachweisen möchte, wann Sie ein Dokument erstellt haben, kann sich an einen vertrauenswürdigen Dritten, häufig eine Website, wenden, um den Nachweis der Erstellungszeit zu überprüfen. Diese wurden in Gerichtsverfahren für Streitigkeiten über geistiges Eigentum verwendet, daher sind sie eine sehr starke Beweisform. Sie sind der Standardweg, um den gewünschten Beweis zu erbringen. (Ich habe die anderen zuerst aufgenommen, weil sie einfach sind, mehr Spaß machen und wahrscheinlich funktionieren werden.)

Dieser Wikipedia-Artikel kann Ihrem Kursleiter helfen, Ihre Beweise zu verstehen, und der Abschnitt mit externen Links enthält viele Anbieter, einschließlich kostenloser. Ich habe einige Tage lang Testdateien durch kostenlose Dateien geführt, bevor ich sie für etwas Wichtiges verwendet habe.

Modus Operandi

Also hast du etwas getan und hast jetzt Beweise, oder? Nein, die Schüler können immer noch sagen, dass Sie ihnen die Idee oder einen anderen Unsinn gestohlen haben. Meine Lösung bestand darin, privat eine oder mehrere meiner Methoden mit meinem Ausbilder festzulegen. Ich fordere den Ausbilder auf, nach Leerzeichen zu suchen, nach bestimmten Symbolen zu suchen usw., aber den anderen niemals zu sagen, was das Wasserzeichen war. Wenn der Ausbilder zustimmt, Ihre einfachen Techniken geheim zu halten, funktionieren sie wahrscheinlich weiterhin einwandfrei. Wenn nicht, gibt es immer vertrauenswürdige Zeitstempel. ;)


5
+1 - Schöne, umfassende Antwort. Wahrscheinlich sollte die akzeptierte Antwort sein.
Andy Thomas

5
Noch eine Idee: Codieren Sie Ihre Initialen in Variablennamen, Feldnamen, Methodennamen, Klassennamen usw. Der Dieb wird es schwer haben, alles neu zu schreiben. (Ich habe es hier erwähnt, da es eine gute Sammlung ist)
Gaborsch

1
+1 GaborSch. Das ist eine schöne Ergänzung. Wenn Sie keine Punkte für mehrdeutige Methodennamen verlieren, kann die Taktik auf diese Weise weniger offensichtlich gemacht werden und die Initialen selbst können innerhalb der Namen verteilt werden.
Nick P

4
Eine weitere Idee, die GaborSchs Kommentar inspirierte: bestimmte Dinge absichtlich falsch zu schreiben. Führen Sie eine sehr ungewöhnliche Rechtschreibfehler einer Funktion oder eines Variablennamens durch. 10 andere Leute haben das Gleiche alleine gemacht? Ja, richtig ... (Anmerkung: Ein prominenter Kritiker der Bibelübersetzung in der Neuen Welt behauptete, es sei ein KJV-Abschlag, und der Beweis war, dass ein seltener grammatikalischer Fehler in KJV in der "brandneuen" NWT lag. Es gibt also einen Präzedenzfall für diese Arbeit. )
Nick P

7
Ein Punkt, der beim "Whitespace-Wasserzeichen" zu beachten ist, ist, dass wenn die IDE Ihren Code (neu) formatiert (z. B. VS C # / Eclipse), diese verschwunden sind.
Alvin Wong

63

Wenn Ihre Klassenkameraden Ihren Code von der Upload-Site gestohlen haben, würde ich Ihre Hausaufgaben verschlüsseln und den Schlüssel per E-Mail an den Lehrer senden. Sie können dies mit PGP tun, wenn Sie kompliziert sein möchten oder etwas so Einfaches wie eine Zip-Datei mit einem Passwort.

BEARBEITEN: Mit PGP können Sie verschlüsseln / signieren, ohne Ihren Schlüssel preiszugeben, aber Sie können die schere Einfachheit einer Zip-Datei mit einem Passwort nicht übertreffen. Wählen Sie also bei jeder Hausaufgabe einen neuen Schlüssel aus. Schönheit in Einfachheit :)


2
Dies ist der einfachste Ansatz.
Jon Raynor

2
Wie beweisen Sie, dass der Code Ihnen gehört? Ich kann Ihren Code stehlen und zippen, als wäre es meiner.
Gaborsch

4
@ LaborSch, wenn ich meinen Code in eine Zip-Datei mit einem Passwort hochlade, sehe ich Ihre gestohlene Version kurz nach dem Hitzetod der Sonne (mit entsprechend gewähltem Passwort)
SeanC

11
Sie können beweisen, dass es sich um Ihren Code handelt, indem Sie den Entschlüsselungsschlüssel erfolgreich bereitstellen.
Jonathan S. Fisher

10
Sicher, es gibt viele theoretische Lücken, aber realistisch gesehen ist es unwahrscheinlich, dass jemand Zugriff auf seine Dateien erhält, wenn er sie verschlüsselt sendet: Es gibt Grenzen, wie weit sie gehen würden, und es gibt Grenzen für ihre Fähigkeiten. Wenn sie es nicht schaffen, eine grafische Benutzeroberfläche für ihre Hausaufgaben zu schreiben, werden sie wahrscheinlich in naher Zukunft keine Passwörter knacken oder sich in einen Computer hacken.
Supr

39

Wenn Sie dem Lehrer Quellcode geben, fügen Sie einfach eine serialVersionUIDIhrer Klassendateien hinzu, die eine verschlüsselte Version Ihres Namens ist. Sie können es dem Lehrer selbst entschlüsseln.

Für die anderen bedeutet das nichts, nur für dich. Sie können sagen, dass es sich um einen generierten Code handelt. Wenn sie ihn stehlen, wird er sich wahrscheinlich überhaupt nicht darum kümmern, ihn zu ändern.

Wenn Sie es auf stilvolle Weise tun möchten, können Sie diesen Trick verwenden , wenn Sie den zufälligen Samen finden, der Ihren Namen erzeugt. :) Das wäre dann deine Nummer , und wo immer es erscheint, würde das beweisen, dass du es warst , der diesen Code gemacht hat.


5
Ein Dieb kann kosmetische Änderungen am Code vornehmen, um den Diebstahl weniger offensichtlich zu machen. Eine UID der Serienversion wäre eine einfache kosmetische Änderung.
Andy Thomas

3
@GaborSch der mit der serialVersionUID ist perfekt danke
allot

2
@ AndyThomas-Cramer Ja, ich sollte eine Methode mit meinem verschlüsselten Namen programmieren und wenn sie entfernt wird, funktioniert das Programm nicht haha
LoremIpsum

2
@ AndyThomas-Cramer Theoretisch ja. In der Praxis sind die meisten Betrüger faul und tun nur das absolute Minimum, das sie für notwendig halten. (Wahrscheinlich ersetzt //written by WarGodNTmit //Written by ImaCheata.) Es ist auch unwahrscheinlich , dass viele von ihnen wissen sogar die svUID sie sprengen könnte. Auch wenn einige von ihnen so schlau sind; Wenn der Großteil der Klasse betrügt, werden einige mit ziemlicher Sicherheit erwischt. Zumindest sollte dies ausreichen, um den Lehrer davon zu überzeugen, seinen Prozess aufzuheben.
Dan spielt am Feuerlicht

3
@WilQu: Sie werden Ihren eigenen Code nicht mit dem Namen oder dem privaten Schlüssel eines anderen signieren, oder?
Stellen Sie Monica am

35

Dies geschah mit einem Paar meiner Schüler, die in derselben Wohnung lebten. Man stahl den Quellcode von einer Festplatte in einer Schreibtischschublade.

Der Dieb hat die gestohlene Quelle leicht modifiziert, so dass es nicht offensichtlich ist. Ich bemerkte sowieso die Ähnlichkeit des Codes und untersuchte die Quelle in einem Editor. Einige der Linien hatten zusätzliche Leerzeichen an den Enden. Die Quelle jedes Schülers hatte die gleiche Anzahl zusätzlicher Leerzeichen.

Sie können dies ausnutzen, um Informationen zu verschlüsseln, ohne sie sichtbar zu machen. Sie können Ihre Initialen oder Ihren Studentenausweis am Ende einiger Zeilen mit Leerzeichen codieren.

Ein Dieb wird wahrscheinlich kosmetische Änderungen am sichtbaren Code vornehmen, aber möglicherweise die nicht sichtbaren Zeichen übersehen.

BEARBEITEN:

Wenn Sie etwas mehr darüber nachdenken, können Sie Leerzeichen und Tabulatoren als Morsecode-Dits und Dahs verwenden und Ihren Namen am Ende mehrerer Zeilen einfügen. Ein Dieb könnte einige Zeilen entfernen, neu anordnen oder neu eingeben, ohne Ihre Identifikation zu zerstören.

EDIT 2:

"Whitespace-Steganographie" ist der Begriff für das Verbergen von Nachrichten in Whitespace. Durch Googeln wird diese Open-Source-Implementierung aus den 90er Jahren enthüllt , bei der Huffman-Codierung anstelle von Morsecode verwendet wird.


2
Gern geschehen, danke für die Frage. Hat mir die Gelegenheit gegeben, über Morsecode-Abstände nachzudenken.
Andy Thomas

1
Jede Java-IDE kann den Code formatieren und alle unsichtbaren Zeichen entfernen ;-) Trotzdem ist die Morsecode-Idee nett :-)
Prakash K

5
Erweiterung: Ersetzen Sie in einem beliebigen Zeichenfolgenliteral einige Leerzeichen durch ein Zeichen, das wie ein Leerzeichen aussieht. Wie das Zeichen Nr. 255 in ASCII oder das "nicht auspackbare Leerzeichen" in Unicode. Die meisten Neulinge bemerken den Unterschied nicht und können so angeben, wer (wahrscheinlich!) Ihre Quellen gestohlen hat.
TheBlastOne

@PrakashK - Ja, das würde dieser Maßnahme entgegenwirken. Eine Kombination von Maßnahmen ist wahrscheinlich am besten.
Andy Thomas

@ TheBlastOne - Gute Idee. Identifiziert dich nicht von selbst, aber es geht nicht verloren, wenn der Dieb neu formatiert.
Andy Thomas

19

Es scheint mir ein IT-Verwaltungsproblem zu sein. Jeder Schüler sollte einen eigenen Upload-Bereich haben, auf den andere Schüler nicht zugreifen können.

Der Lehrer wäre eine höhere Stufe und könnte auf jeden Schüler-Upload-Ordner zugreifen. Wenn dies nicht möglich ist, gehen Sie zu @exabrial answer, da dies die einfachste Lösung ist.


9

Das Beste, was Sie tun können, ist, den Quellcode mit einem Passwort zu komprimieren und das Passwort per E-Mail an den Lehrer zu senden.

Problem gelöst.


2
+1 zu einfachen Lösungen. Überentwickeln Sie es nicht. Aber erkundigen Sie sich zuerst bei Professor, ob er damit einverstanden ist.
Eduardo

6

Verwenden Sie ein verteiltes (= eigenständiges) Versionskontrollsystem wie git . Könnte auch nützlich sein.

Ein Versionsverlauf mit Ihrem Namen und Datum kann ausreichend überzeugend sein.


2
Aber OP versäumt nicht zu beweisen, dass seine Quelle von ihm geschaffen wurde. Es fällt ihm schwer zu beweisen, dass Schulkameraden seine Quellen für ihre verwenden.
TheBlastOne

2
Ein verteiltes VCS ist ziemlich komplex. Der Autor muss lediglich die Originalität des Inhalts und / oder das Kopieren nachweisen. Dies kann mit jedem Mechanismus zur Übermittlung von Dateien erreicht werden, der die Übermittlung mit einem Zeitstempel versehen, den Übermittler identifiziert und es den Schülern nicht ermöglicht, Übermittlungen zu löschen. Dies kann mit etwas so Einfachem wie einem FTP- oder Webserver erfolgen.
Nick P

1
Es ist ziemlich einfach, ein Skript zu schreiben, das das Festschreibungsprotokoll scannt und ein neues Repo mit demselben Verlauf, aber einem anderen Benutzer erstellt.
Mikerobi

@mikerobi git filter-branchwurde für solche verrückten Sachen gebaut, das sollte nicht einfach sein
Izkata

@Izkata, ich habe die Möglichkeit einer Änderung des Revisionsverlaufs nicht in Betracht gezogen. Ich dachte an ein Skript, das die erste Revision auscheckt und in ein anderes Repo festschreibt, dann die zweite Revision auscheckt und das neue Repo festschreibt, wiederholt. Ähnlich wie einige Tools zum Konvertieren von einem VCS in ein anderes funktionieren.
Mikerobi

3

Was wurde gestohlen?

  • Die Quelle ? Sie können zufällige Zeichenfolgen einfügen (diese können jedoch geändert werden). Sie können auch versuchen, ein spezielles Verhalten hinzuzufügen, das nur von Ihnen bekannt ist (ein spezieller Tastendruck ändert eine Farbzeile). Anschließend können Sie den Lehrer fragen: "Die anderen kennen diese spezielle Kombination?". Der beste Weg ist, das Programm zum Absturz zu bringen, wenn nach 5 Minuten Aktivität keine leere, nutzlose Datei im Archiv vorhanden ist. Ihre Schulkameraden sind zu faul, um diese Zeit zu warten.

  • Die Binärdatei? Es reicht aus, nur die Prüfsumme jeder Klasse zu vergleichen (Ihre Schulkameraden sind zu faul, um die Klassendateien neu zu schreiben).


2

Veröffentlichen Sie Ihre Lösung einfach in letzter Minute. Dies gibt niemandem Zeit, es zu kopieren.

Senden Sie dem Administrator ein Feedback, damit die Schüler die Aufgaben anderer Schüler nicht sehen können.


1

Wenn Sie die Datei in eine ZIP-Datei mit Kennwortverschlüsselung hochladen, kann jeder das Kennwort einfach durch Herunterladen der ZIP-Datei knacken und seine CPU eine Million Abfragen ausführen lassen, wenn er ein so großer Betrügerdieb ist. Leider sind einige und es ist einfach zu tun.

Ihre Quelle kann von den anderen Schülern auf dem freigegebenen Server angezeigt werden. Der Lehrer sollte Ihnen wirklich Ihr eigenes passwortverschlüsseltes Verzeichnis zum Hochladen geben. Dies kann einfach durch Hinzufügen von Subdomains erfolgen. Aber vielleicht erlaubt Ihnen der Lehrer, die Dateien auf Ihren eigenen Server hochzuladen, damit er dort darauf zugreifen kann.

Es ist auch möglich, das Skript so zu verschleiern, dass es ein document.write enthält ('Diese Seite wurde von xxxxx geschrieben'), wodurch jeder, der Ihre Arbeit kopiert, gezwungen wird, das Guthaben erst zu entfernen, wenn er es zuerst entschlüsselt. Die eigentliche Antwort ist jedoch, dass Ihre Schule jedem ihrer Schüler ein eigenes passwortgeschütztes Verzeichnis geben muss.


0

In meinem Fall kamen meine Lehrer mit einem besseren Ansatz. Die Fragen, die sie gestellt haben, haben etwas mit unserer Registrierungsnummer zu tun. Ex:

Die Eingabe für eine Funktion / Theorie ist unsere Registrierungsnummer, die für jeden Schüler unterschiedlich ist

Die Antworten oder die Herangehensweise an die Lösung unterscheiden sich also relativ von jedem Schüler. Dadurch muss jeder Schüler seine Hausaufgaben selbst machen oder zumindest lernen, wie er den Ansatz mit seiner eigenen Registrierung hackt kann schwieriger sein als die Lektion zu lernen;)].

Hope your lecturer will read this thread before his next tutorial :D
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.