Защита исходного кода Java от доступа [закрыто]

96

На прошлой неделе мне пришлось создать небольшой графический интерфейс для домашнего задания. Никто из моих одноклассников этого не сделал. Они украли мой, откуда мы должны были его загрузить, а затем снова загрузили как свой. Когда я сказал своему учителю, что это все моя работа, он мне не поверил.

Итак, я подумал о том, чтобы поместить внутрь бесполезный метод или что-то еще с доказательством того, что я его закодировал. Я подумал о шифровании. Моя лучшая идея до сих пор:

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

Можете ли вы придумать другие способы лучше?

WarGodNT
источник
31
Разве файлы не имеют отметки времени на сайте загрузки?
Averroes
76
Вы хотите сказать, что они могут загрузить ваш код с того места, где вы его загрузили? Это кажется безумием. Вы должны подвергнуть сомнению методы учителя. Желательно поговорить со своим боссом, так как он / она кажется немного неразумным.
keyser
56
Epic провалить одно из ваших домашних заданий и позволить провалить весь класс.
состоялось
25
Похоже, учитель тоже новичок ...
UmNyobe
22
Единственное, что можно сделать в этой ситуации, - это попытаться исправить проблему, поговорив с учителем о том, как вы загружаете домашнее задание. Загружать его в область, где вы можете скачать чужие работы, просто глупо - я не уверен, что учитель, который считает такой подход хорошим, действительно должен преподавать!
Майкл Берри

Ответы:

104

У меня была такая же проблема, как и у вас, давным-давно. У нас были машины с Windows 2000, и мы загружали файлы в сетевую папку Novel, которую могли видеть все. Я использовал несколько уловок, чтобы победить даже лучших воров: водяные знаки в виде пробелов; водяные знаки метаданных; необычные персонажи; доверенная метка времени; modus operandi. Вот они по порядку.

Водяные знаки пробела:

Это мой оригинальный вклад в создание водяных знаков. Мне нужен был невидимый водяной знак, который работал бы в текстовых файлах. Уловка, которую я придумал, заключалась в том, чтобы вставить определенный образец пробелов между операторами программирования (или абзацами). Файл для них выглядел одинаково: некоторые программные инструкции и разрывы строк. Тщательный выбор текста приведет к появлению пробелов. Каждая пустая строка будет содержать определенное количество пробелов, которые, очевидно, не являются случайными или случайными. (например, 17) На практике этот метод работал за меня, потому что они не могли понять, что я вставлял в документы.

Водяные знаки метаданных

Здесь вы меняете метаданные файла, чтобы они содержали информацию. Вы можете встроить свое имя, хэш и т.д. в невидимые части файла, особенно в EXE. В дни NT были популярны альтернативные потоки данных.

Необычные персонажи

Я брошу это просто ради удовольствия. Старый трюк с олицетворением IRC заключался в том, чтобы создать имя из букв, похожих на имя другого человека. Вы можете использовать это в водяных знаках. Карта символов в Windows предоставит вам множество необычных символов, которые похожи, но не являются буквой или цифрой, которые вы можете использовать в исходном коде. Их появление в определенном месте на чужой работе не может быть случайным.

Надежная отметка времени

Вкратце, вы отправляете файл (или его хэш) третьей стороне, которая затем добавляет к нему временную метку и подписывает ее закрытым ключом. Любой, кто хочет подтвердить, когда вы создали документ, может обратиться к доверенной третьей стороне, часто на веб-сайт, для проверки вашего доказательства времени создания. Они использовались в судебных делах по спорам об интеллектуальной собственности, поэтому являются очень сильным доказательством. Это стандартный способ получить доказательство, которое вы ищете. (Сначала я включил другие, потому что они легкие, они веселее и, вероятно, будут работать.)

Эта статья в Википедии может помочь вашему инструктору понять ваши доказательства, а в разделе внешних ссылок есть много поставщиков, в том числе бесплатных. Я бы пропустил тестовые файлы через бесплатные в течение нескольких дней, прежде чем использовать их для чего-то важного.

Порядок работы

Итак, вы что-то сделали, и теперь у вас есть доказательства, верно? Нет, студенты все равно могут сказать, что вы украли у них идею, или еще какую-то чушь. Мое решение этой проблемы заключалось в том, чтобы в частном порядке разработать один или несколько моих методов с моим инструктором. Я говорю инструктору искать пробелы, искать определенные символы и т. Д., Но никогда не сообщать другим, что это был за водяной знак. Если инструктор согласится сохранить ваши простые техники в секрете, они, вероятно, продолжат работать нормально. Если нет, всегда есть надежная метка времени. ;)

Ник П
источник
5
+1 - Хороший, исчерпывающий ответ. Наверное, должен быть принятый ответ.
Энди Томас
5
Еще одна идея: закодируйте свои инициалы в именах переменных, именах полей, именах методов, именах классов и т. Д. Вору будет трудно все переписать. (Я упомянул об этом здесь, так как это хорошая коллекция)
gaborsch
1
+1 GaborSch. Хорошее дополнение. Если вы не теряете баллов из-за неоднозначных имен методов, тогда тактика может быть менее очевидной, а сами инициалы могут быть распределены внутри имен.
Nick P
4
Еще одна идея, вдохновленная комментарием Габорша: намеренно неправильно написано в некоторых вещах. Совершайте очень необычные ошибки в написании имени какой-либо функции или переменной. 10 человек сделали то же самое самостоятельно? Да, верно ... (Примечание: один видный критик перевода Библии Нового Света утверждал, что это была подделка KJV, и было доказано, что редкая грамматическая ошибка в KJV была в "совершенно новом" NWT. Итак, есть прецедент для этой работы. )
Nick P
7
Следует отметить, что если IDE (пере) отформатирует ваш код (например, VS C # / Eclipse), они исчезнут.
Элвин Вонг
63

Если ваши одноклассники украли ваш код с сайта загрузки, я зашифрую вашу домашнюю работу и отправлю ключ учителю по электронной почте. Вы можете сделать это с помощью PGP, если хотите усложнить ситуацию, или чего-то столь же простого, как Zip-файл с паролем.

РЕДАКТИРОВАТЬ: PGP позволит вам зашифровать / подписать, не раскрывая ваш ключ, но вы не можете превзойти простоту Zip-файла с паролем, поэтому просто выбирайте новый ключ при каждом домашнем задании. Красота в простоте :)

Джонатан С. Фишер
источник
2
Это самый простой способ.
Джон Рейнор
2
Как доказать, что код принадлежит вам? Я могу украсть ваш код и заархивировать его, как если бы он был моим.
gaborsch
4
@GaborSch, если я загружу свой код в zip-файл с паролем, я увижу вашу украденную версию вскоре после тепловой смерти от солнца (с соответствующим образом выбранным паролем)
SeanC
11
Вы можете доказать, что это был ваш код, успешно предоставив ключ дешифрования.
Джонатан С. Фишер
10
Конечно, в теории есть много пробелов, но на практике маловероятно, что кто-то получит доступ к его файлам, если он отправит их в зашифрованном виде: есть пределы того, как далеко они зайдут, и есть пределы их возможностей. Если им не удастся написать графический интерфейс для своей домашней работы, то, скорее всего, они не будут в ближайшее время взламывать пароли или взламывать какой-либо компьютер.
вс,
39

Если вы передаете исходный код учителю, просто добавьте serialVersionUIDв один из файлов вашего класса зашифрованную версию вашего имени. Вы можете сами расшифровать его учителю.

Это ничего не значит для других, только для вас. Вы можете сказать, что это сгенерированный код, если они его воруют, вероятно, вообще не потрудятся изменить.

Если вы хотите сделать это стильно, вы можете использовать этот трюк , если найдете случайное семя, которое производит ваше имя. :) Тогда это будет ваш номер , и где бы он ни появился, это будет доказывать, что это вы сделали этот код.

Габорш
источник
5
Вор может внести в код косметические изменения, чтобы сделать кражу менее очевидной. UID серийной версии можно было бы легко изменить косметически.
Энди Томас
3
@GaborSch один с serialVersionUID идеально подходит благодаря наделите
LoremIpsum
2
@ AndyThomas-Cramer, да, я должен запрограммировать метод с моим зашифрованным именем в нем, и если он будет удален, программа не будет работать, ха-ха
LoremIpsum
2
@ AndyThomas-Cramer Теоретически да. На практике большинство читеров ленивы и делают только тот минимум, который они считают необходимым. (Вероятно, заменив //written by WarGodNTна //Written by ImaCheata.) Также маловероятно, что многие из них даже знают, что svUID может их сломать. Даже если некоторые из них настолько умны; если большая часть класса жульничает, некоторые почти наверняка будут пойманы. Как минимум, этого должно быть достаточно, чтобы убедить учителя отключить свой процесс.
Dan Is Fiddling By Firelight
3
@WilQu: Вы ведь не будете подписывать свой код чужим именем или закрытым ключом?
Unslander Monica
35

Это случилось с парой моих студентов, которые жили в одной квартире. Один украл исходный код с диска, оставленного в ящике стола.

Похититель немного модифицировал украденный источник, чтобы это было неочевидно. Я все равно заметил схожесть кода и просмотрел исходник в редакторе. На концах некоторых строк были лишние пробелы. В источнике каждого студента было одинаковое количество дополнительных пробелов.

Вы можете использовать это для кодирования информации, не делая ее видимой. Вы можете закодировать свои инициалы или студенческий билет в конце некоторых строк с пробелами.

Вор, скорее всего, внесет косметические изменения в видимый код, но может пропустить невидимые символы.

РЕДАКТИРОВАТЬ:

Подумав об этом еще немного, вы можете использовать пробелы и табуляции в качестве точек и точек кода Морзе и поставить свое имя в конце нескольких строк. Вор может удалить, переупорядочить или перепечатать некоторые строки, не уничтожая вашу идентификацию.

РЕДАКТИРОВАТЬ 2:

«Стеганография пустого пространства» - это термин для сокрытия сообщений в пустом пространстве. Поиск в Google показывает, что эта реализация с открытым исходным кодом, относящаяся к 90-м годам, использует кодировку Хаффмана вместо кода Морзе.

Энди Томас
источник
2
Пожалуйста, спасибо за вопрос. Дали мне возможность подумать о интервале в коде Морзе.
Энди Томас
1
Любая Java IDE может форматировать код, удаляя все невидимые символы ;-) Тем не менее идея кода Морзе хороша :-)
Prakash K
5
Расширение: в любом строковом литерале замените некоторые пробелы символом, который выглядит как пробел. Например, символ # 255 в ASCII или «необратимый пробел» в юникоде. Большинство новичков не заметят разницы, и это позволит вам указать, кто (возможно!) Украл ваши исходники.
TheBlastOne
@PrakashK - Да, это противоречит этой мере. Сочетание мер, вероятно, лучше всего.
Энди Томас
@TheBlastOne - Хорошая идея. Сам по себе не идентифицирует вас, но он не потеряется, если вор переформатирует.
Энди Томас
19

Мне это кажется проблемой ИТ-администрирования. У каждого студента должна быть собственная область загрузки, к которой другие студенты не смогут получить доступ.

Учитель будет на более высоком уровне и сможет получить доступ к папке загрузки каждого ученика. Если это невозможно, используйте @exabrial ответ, поскольку это самое простое решение.

Джон Рейнор
источник
9

Лучшее, что вы можете сделать, - это просто заархивировать исходный код с паролем и отправить его учителю по электронной почте.

Задача решена.

Омид
источник
2
+1 к простым решениям. Не переусердствуйте. Но сначала посоветуйтесь с профессором, согласен ли он с этим.
Эдуардо
6

Используйте распределенную (= автономную) систему контроля версий , например git . Тоже может пригодиться.

История версий с вашим именем и датами может быть достаточно убедительной.

Юп Эгген
источник
2
Но ОП не преминет доказать, что его источник был создан им самим. Ему трудно доказать, что одноклассники используют его источники для своих.
TheBlastOne
2
Распределенная VCS довольно сложна. Все, что нужно автору - это доказать оригинальность содержания и / или копирования. Это может быть выполнено с помощью любого механизма отправки файла, который отмечает время отправки, идентифицирует отправителя и не позволяет студентам удалять отправленные материалы. Это можно сделать с помощью чего-то столь же простого, как FTP или веб-сервер.
Nick P
1
Довольно легко написать скрипт, который будет сканировать журнал фиксации и воссоздавать новое репо с той же историей, но с другим пользователем.
микероби
@mikerobi git filter-branchбыл создан для подобных безумных вещей, это должно быть непросто
Изката
@Izkata, я не рассматривал возможность изменения истории ревизий. Я думал о скрипте, который проверяет первую ревизию и фиксирует ее в другом репо, затем проверяет вторую ревизию и исправляет, что новое репо коммитирует, повторяет. Подобно тому, как работают некоторые инструменты для преобразования одной VCS в другую.
микероби
3

Что было украдено?

  • Источник ? Вы можете помещать в него случайные строки (но это можно изменить). Вы также можете попробовать добавить особое поведение, известное только вам (специальное нажатие клавиши изменит цветовую строку), затем вы можете спросить учителя: «Другие знают эту особую комбинацию?». Лучшим способом будет сбой программы, если через 5 минут активности в архиве не окажется пустого, бесполезного файла, ваши одноклассники будут слишком ленивы ждать это количество времени.

  • Бинарный? Достаточно просто сравнить контрольную сумму каждого .class (ваши одноклассники слишком ленивы, чтобы переписывать файлы классов)

Карточ
источник
2

Просто опубликуйте свое решение в последнюю минуту. Это не даст никому времени скопировать его.

И отправьте отзыв администратору, чтобы запретить учащимся просматривать задания других учащихся.

Эдуардо
источник
1

Если вы загрузите файл в формате .zip с шифрованием пароля, любой может просто взломать пароль, загрузив файл .zip, и заставить свой процессор выполнить миллион запросов к нему, если они настолько большие воры-читы. К сожалению, некоторые из них есть, и это легко сделать.

Ваш источник могут просматривать другие студенты на общем сервере. Учитель действительно должен дать вам ваш собственный зашифрованный паролем каталог для загрузки. Это можно легко сделать, просто добавив поддомены. Но, возможно, учитель может позволить вам загрузить файлы на ваш собственный сервер, чтобы он мог получить к ним доступ.

Также возможно запутать сценарий, чтобы в нем был документ document.write («Эта страница была написана xxxxx»), заставляя всех, кто копирует вашу работу, не иметь возможности удалить кредит, если они сначала не расшифруют ее. Но настоящий ответ заключается в том, что ваша школа должна предоставить каждому из своих учеников свои собственные каталоги, защищенные паролем.

майкл д
источник
0

В моем случае мои учителя предложили лучший подход. Заданные ими вопросы как-то связаны с нашим регистрационным номером. Пример:

Входными данными для функции / теории является наш регистрационный номер, который у каждого студента разный.

Таким образом, ответы или подход к решению проблемы у каждого студента относительно различаются. Это заставляет всех студентов обязательно делать домашнее задание самостоятельно или, по крайней мере, знать, как взломать подход с помощью собственной регистрации [it может быть труднее, чем выучить урок;)].

Hope your lecturer will read this thread before his next tutorial :D
Чанд Приянкара
источник