アクセスされることからのJavaソースコードの保護[終了]


96

先週、宿題用の小さなGUIを作成する必要がありました。私の学校の仲間は誰もそれをしませんでした。彼らは私たちがそれをアップロードしなければならなかった場所から私のものを盗み、それから彼らは彼らのものとして再びそれをアップロードしました。私が先生に言ったとき、それはすべて私の仕事でした、彼は私を信じていませんでした。

だから私はそれをコード化した証拠を使って、役に立たないメソッドか何かを中に入れることを考えました。暗号化について考えました。これまでの私の最高のアイデア:

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

他にもっと良い方法を考えられますか?


31
アップロードサイトにファイルのタイムスタンプがありませんでしたか?
Averroes 2013

76
アップロードした場所からコードをダウンロードできると言っているのですか?それはおかしいようです。あなたは先生の方法に疑問を投げかけるべきです。彼/彼女は少し無理が​​あるように見えるので、彼/彼女の上司に話すことによってできれば。
キーサー2013

56
Epicが宿題の1つに失敗し、クラス全体が失敗するようにします。
2013

25
先生も初心者のようです...
UmNyobe

22
この状況で唯一賢明なことは、宿題をアップロードする方法について教師と話し合って問題を修正することです。他の人の提出物をダウンロードできる場所にアップロードするのはばかげているだけです。そのアプローチが優れていると考える教師が本当に教えるべきかどうかはわかりません。
Michael Berry、

回答:


104

私はずっと前にあなたと同じ問題を抱えていました。Windows 2000マシンがあり、誰もが見ることができるNovelネットワークフォルダにファイルをアップロードしました。私はいくつかのトリックを使って最高の泥棒をも倒しました。メタデータ透かし; 珍しいキャラクター; 信頼できるタイムスタンプ。modus operandi。これが順番です。

空白の透かし:

これは、透かしへの私の最初の貢献です。テキストファイルで機能する非表示の透かしが必要でした。私が思いついたトリックは、プログラミングステートメント(または段落)の間に空白の特定のパターンを挿入することでした。ファイルはそれらに同じように見えました:いくつかのプログラミングステートメントと改行。テキストを注意深く選択すると、空白が表示されます。それぞれの空の行には、明らかにランダムでも偶然でもない特定の数のスペースが含まれます。(例17)実際には、私がドキュメントに埋め込んでいるものを理解できなかったため、この方法でうまくいきました。

メタデータ透かし

ここで、ファイルのメタデータを変更して情報を含めます。名前、ハッシュなどをファイルの見えない部分、特にEXEに埋め込むことができます。NT日では、代替データストリームが一般的でした。

珍しいキャラクター

キックのためにこれを投げます。古いIRCのなりすましのトリックは、他の人の名前に似た文字で名前を付けることでした。これを透かしに使用できます。Windowsの文字マップは、ソースコードで使用する可能性のある文字や数字に似ているが、似ていない多くの変わった文字を提供します。これらが他の誰かの作品の特定の場所に現れるのは偶然ではありません。

信頼できるタイムスタンプ

簡単に言えば、ファイル(またはそのハッシュ)を第三者に送信し、第三者がタイムスタンプを付加して秘密鍵で署名します。いつドキュメントを作成したかを証明したい人は、信頼できるサードパーティ(通常はWebサイト)にアクセスして、作成時間の証明を確認できます。これらは知的財産紛争の訴訟で使用されているため、非常に強力な証拠となります。それらはあなたが求めている証明を達成するための標準的な方法です。(私は他の人たちを最初に含めましたb / c彼らは簡単です、彼らはもっと楽しく、おそらくうまくいくでしょう。)

このウィキペディアの記事は、講師が証拠を理解するのに役立つ可能性があります。外部リンクセクションには、無料のプロバイダーを含む多くのプロバイダーがあります。テストファイルを無料のファイルで数日間実行してから、重要なものに使用します。

Modus Operai

それで、あなたは何かをしました、そしてあなたは今証明が正しいのですか?いいえ、学生はあなたが彼らまたは他のなんらかのナンセンスからアイデアを盗んだと言うことができます。これに対する私の修正は、プライベートで、インストラクターと一緒に1つ以上のメソッドを確立することでした。空白を探したり、特定の記号を探したりするようにインストラクターに指示しますが、透かしが何であるか他の人には決して伝えないようにします。講師があなたの簡単なテクニックを秘密にしておくことに同意する場合、彼らはおそらくうまく働き続けるでしょう。そうでない場合は、常に信頼できるタイムスタンプがあります。;)


5
+1-素敵で包括的な答え。おそらく受け入れられた答えであるべきです。
アンディトーマス

5
もう1つのアイデア:変数名、フィールド名、メソッド名、クラス名などでイニシャルをエンコードします。泥棒はすべてを書き直すのに苦労するでしょう。(良いコレクションなのでここで触れました)
gaborsch 2013

1
+1 GaborSch。それは素晴らしい追加です。あいまいなメソッド名のポイントを失うことがない場合、その方法はその方法であまり明白でなくなり、イニシャル自体が名前内に広がる可能性があります。
Nick P

4
GaborSchのコメントに触発された別のアイデア:意図的に特定のものにスペルミスをした。一部の関数または変数名の非常にまれなスペルミスを行います。他の10人が自分で同じことをしましたか?そうです...(注:新世界の聖書翻訳の著名な批評家は、KJVのノックオフであると主張し、KJVのまれな文法エラーが「真新しい」NWTにあるという証拠でした。したがって、この作業には前例があります。 )
Nick P

7
「空白の透かし」について注意すべき1つの点は、IDEがコード(たとえばVS C#/ Eclipse)を(再)フォーマットすると、消えてしまうということです。
Alvin Wong

63

クラスメートがアップロードサイトからコードを盗んだ場合、私は宿題を暗号化し、鍵を教師にメールで送信します。複雑にしたい場合、またはパスワードを含むZipファイルのように単純な場合は、PGPを使用してこれを行うことができます。

編集:PGPを使用すると、鍵を明かさずに暗号化/署名できますが、Zipファイルの単純なパスワードに勝るものはないので、宿題ごとに新しい鍵を選択するだけです。シンプルな美しさ:)


2
これは最も単純なアプローチです。
Jon Raynor 2013

2
コードが自分のものであることをどのように証明しますか?私はあなたのコードを盗むことができ、それが私のものであるかのように圧縮できます。
gaborsch 2013

4
@GaborSch、コードをzipファイルにパスワードと共にアップロードすると、太陽が
熱死した

11
復号化キーを提供することで、それがコードであることを証明できます。
ジョナサンS.フィッシャー

10
もちろん、理論上は多くの穴がありますが、現実的には、暗号化して送信した場合、誰もが自分のファイルにアクセスする可能性は低いと考えられます。彼らが宿題のGUIを書くことができなければ、パスワードを解読したり、誰かのコンピューターにハッキングしたりすることはないでしょう。
2013

39

教師にソースコードを提供する場合は、単に serialVersionUIDは、名前を暗号化したクラスファイルの1つにをです。自分で解読することができます。

それはあなたのためだけに、他の人には何の意味もありません。それが生成されたコードであると言うことができ、彼らがそれを盗んでいる場合、おそらくそれを変更することはまったく気になりません。

スタイリッシュな方法でやりたい場合は、このトリックを使用できます。名前を生成するランダムシードが見つかった場合は、:)それはあなたの番号であり、それがどこに現れても、そのコードを作ったのはあなたであることが証明されます。


5
泥棒は、盗難を目立たなくするために、コードに表面的な変更を加える場合があります。シリアルバージョンのUIDは、簡単な表面的な変更です。
アンディトーマス

3
@ GaborSch、serialVersionUIDを持つものは完璧に感謝です
LoremIpsum 2013

2
@ AndyThomas-Cramerはい、暗号化された名前を含むメソッドをプログラムする必要があります。メソッドを削除すると、プログラムは
機能しません

2
@ AndyThomas-Cramer理論的にはそうです。実際には、ほとんどの詐欺師は怠惰であり、彼らが必要だと思う最小限のことだけを行います。(おそらくに置き換え//written by WarGodNTられ//Written by ImaCheataます。)また、svUIDがバストできることを知っている人もほとんどいません。それらのいくつかがそれほど賢くても、クラスのほとんどが不正行為をしている場合、数人が捕まることはほぼ確実です。少なくとも、教師にプロセスを妨げないように説得するには十分なはずです。
ダンはFirelightによっていじっている

3
@WilQu:他の人の名前や秘密鍵で自分のコードに署名することはありませんか?
モニカを

35

これは、同じアパートに住んでいた2人の生徒に起こりました。机の引き出しに残ったディスクからソースコードを盗みました。

泥棒は盗んだソースをわずかに変更したため、それは明白ではありません。とにかくコードの類似性に気づき、エディタでソースを調べました。一部の行の端に余分なスペースがありました。各学生のソースには、同じ数の余分なスペースがありました。

これを悪用して、情報を表示せずにエンコードすることができます。いくつかの行の終わりに、スペースを入れてイニシャルまたは学生IDをエンコードできます。

泥棒は目に見えるコードに表面的な変更を加える可能性がありますが、目に見えない文字を見逃す可能性があります。

編集:

これについてもう少し考えると、スペースとタブをモールス符号の点と点として使用し、名前を複数行の最後に置くことができます。泥棒は、IDを破壊することなく、一部の行を削除、並べ替え、または再入力できます。

編集2:

「ホワイトスペースステガノグラフィー」は、メッセージをホワイトスペースに隠すための用語です。それをグーグルすると、モールスコードの代わりにハフマンエンコーディングを使用して、90年代にさかのぼるこのオープンソース実装が明らかになります。


2
質問ありがとうございます。モールス符号の間隔について考える機会をくれた。
アンディトーマス

1
すべてのJava IDEは、すべての非表示の文字を削除してコードをフォーマットできます;-)それでもモールスコードのアイデアは素晴らしいです:-)
Prakash K

5
拡張子:任意の文字列リテラルで、一部の空白を空白のように見える文字に置き換えます。ASCIIの#255の文字、またはUnicodeの「ラップできない空白」のように。ほとんどの初心者は違いに気付かないでしょう、そしてそれはあなたが(おそらく!)誰があなたのソースを盗んだかを示すことを可能にします。
TheBlastOne 2013

@PrakashK-はい、それはこの対策に対抗するでしょう。対策の組み合わせがおそらく最良です。
アンディトーマス

@TheBlastOne-いい考え。それ自体はあなたを識別しませんが、泥棒が再フォーマットしても失われません。
アンディトーマス

19

IT管​​理の問題のようです。各学生には、他の学生がアクセスできない独自のアップロード領域が必要です。

教師はより高いレベルになり、各生徒のアップロードフォルダにアクセスできるようになります。これが可能でない場合は、@ exabrialの回答を使用してください。これが最も簡単な解決策です。


9

あなたができる最善のことは、ソースコードをパスワードで圧縮し、そのパスワードを教師に電子メールで送信することです。

問題が解決しました。


2
+1から単純なソリューション。やりすぎないでください。しかし、彼がこれで大丈夫かどうか教授に確認してください。
エドゥアルド

6

gitなどの分散(=スタンドアロン)バージョン管理システムを使用します。役に立つかもしれません。

あなたの名前と日付のバージョン履歴は十分説得力があるかもしれません。


2
しかし、OPは彼のソースが彼によって作成されたことを証明するために失敗しません。彼は、学友が自分の情報源を自分の情報源に使用していることを証明するのに苦労しています。
TheBlastOne 2013

2
分散型VCSは非常に複雑です。著者が必要とするのは、コンテンツやコピーの独創性を証明することです。これは、提出にタイムスタンプを付け、提出者を識別し、学生が提出を削除できないようにする任意のファイル提出メカニズムで実現できます。これは、FTPまたはWebサーバーのような単純なもので実行できます。
Nick P

1
コミットログをスキャンして、履歴は同じでユーザーが異なる新しいリポジトリを再作成するスクリプトを書くのは非常に簡単です。
ミケロビ2013


@Izkata、私は改訂履歴を変更する可能性を考慮していませんでした。最初のリビジョンをチェックアウトして別のリポジトリにコミットし、次に2番目のリビジョンをチェックアウトして新しいリポジトリコミットにパッチを適用して繰り返すスクリプトを考えていました。あるVCSから別のVCSに変換するためのいくつかのツールが機能する方法に似ています。
ミケロビ2013

3

何が盗まれましたか?

  • 起源 ?ランダムな文字列を入れることができます(ただし、変更できます)。また、自分だけが知っている特別な動作を追加してみて(特別なキーを押すと色の行が変わる)、教師に「他の人がこの特別なコンボを知っている」と尋ねることができます。最善の方法は、アクティビティの5分後に空の役に立たないファイルがアーカイブに存在しない場合にプログラムをクラッシュさせることです。学校の仲間はこの時間を待つのが面倒です。

  • バイナリ?各.classのチェックサムを比較するだけで十分です(学校の仲間はクラスファイルを書き直すのが面倒です)


2

直前にソリューションを投稿してください。これは誰にでもそれをコピーする時間を与えません。

また、管理者にフィードバックを送信して、生徒が他の生徒の課題を閲覧できないようにします。


1

パスワード暗号化を使用して.zipでファイルをアップロードした場合、誰もが.zipファイルをダウンロードしてパスワードを解読し、詐欺師のようなものであれば、CPUに100万のクエリを実行させることができます。残念ながら、いくつかはあり、それを行うのは簡単です。

あなたのソースは、他の学生が共有サーバーで見ることができます。先生は本当にあなたがアップロードするあなた自身のパスワード暗号化されたディレクトリをあなたに与えているべきです。これは、サブドメインを追加するだけで簡単に実行できます。しかし、おそらく教師はあなたが自分のサーバーにファイルをアップロードして、そこにアクセスできるようにするかもしれません。

スクリプトを難読化してdocument.write( 'このページはxxxxxによって作成されました')を作成して、最初に復号化しない限り、あなたの作品をコピーした人がクレジットを削除できないようにすることもできます。しかし、本当の答えは、あなたの学校は各生徒にパスワードで保護された独自のディレクトリを提供する必要があるということです。


0

私の場合、私の教師はより良いアプローチを採用しました。彼らが提供した質問は、私たちの登録番号と関係があります。例:

関数/理論への入力は、学生ごとに異なる登録番号です

したがって、解答または解決策へのアプローチは各学生によって比較的異なります。これにより、必然的にすべての学生が自分で宿題を行うか、少なくとも自分の登録でアプローチをハッキングする方法を知る必要があります[itレッスンを学ぶよりも難しいかもしれません;)]。

Hope your lecturer will read this thread before his next tutorial :D
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.