Ochrona kodu źródłowego Java przed dostępem [zamknięte]

96

W zeszłym tygodniu musiałem stworzyć mały GUI do pracy domowej. Żaden z moich kolegów ze szkoły tego nie zrobił. Ukradli mój plik, skąd musieliśmy go przesłać, a następnie przesłali go ponownie jako swój. Kiedy powiedziałem nauczycielowi, że to cała moja praca, nie uwierzył mi.

Pomyślałem więc o umieszczeniu w środku bezużytecznej metody lub czegoś z dowodem, że to zakodowałem. Myślałem o szyfrowaniu. Jak dotąd mój najlepszy pomysł:

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

Czy możesz wymyślić inne lepsze sposoby?

WarGodNT
źródło
31
Czy pliki nie miały sygnatury czasowej w witrynie przesyłania?
Averroes
76
Czy twierdzisz, że mogą pobrać Twój kod z miejsca, w którym go przesłałeś? To wydaje się szalone. Powinieneś kwestionować metody nauczyciela. Najlepiej rozmawiać ze swoim szefem, ponieważ wydaje się on być nieco nierozsądny.
keyser
56
Epickie niezaliczenie jednej z twoich prac domowych i niech cała klasa obleje.
odbyło się
25
Wygląda na to, że nauczyciel jest również początkującym ...
UmNyobe
22
Jedyną rozsądną rzeczą do zrobienia w tej sytuacji jest próba rozwiązania problemu, rozmawiając z nauczycielem o tym, jak przesyłasz swoją pracę domową. Umieszczenie go w miejscu, z którego można pobrać prace innych osób, jest po prostu głupie - nie jestem pewien, czy nauczyciel, który uważa, że ​​takie podejście jest dobre, naprawdę powinien uczyć!
Michael Berry

Odpowiedzi:

104

Miałem ten sam problem co ty dawno temu. Mieliśmy komputery z systemem Windows 2000 i przesyłaliśmy pliki do folderu sieciowego Novel, który każdy mógł zobaczyć. Użyłem kilku sztuczek, aby pokonać nawet najlepszych złodziei: znak wodny z białymi znakami; znak wodny metadanych; niezwykłe postacie; zaufane znaczniki czasu; modus operandi. Oto ich w kolejności.

Białe znaki wodne:

To jest mój oryginalny wkład w tworzenie znaków wodnych. Potrzebowałem niewidocznego znaku wodnego, który działałby w plikach tekstowych. Sztuczka, na którą wpadłem, polegała na umieszczeniu określonego wzorca białych znaków między instrukcjami programowania (lub akapitami). Plik wyglądał dla nich tak samo: niektóre instrukcje programowania i podziały wierszy. Ostrożne zaznaczenie tekstu spowoduje wyświetlenie spacji. Każdy pusty wiersz zawierałby pewną liczbę spacji, które oczywiście nie są przypadkowe ani przypadkowe. (np. 17) W praktyce ta metoda zadziałała za mnie, ponieważ nie mogli dowiedzieć się, co umieszczam w dokumentach.

Znak wodny metadanych

Tutaj możesz zmienić metadane pliku, aby zawierały informacje. Możesz osadzić swoje imię i nazwisko, skrót itp. W niewidocznych częściach pliku, szczególnie w plikach EXE. W dniach NT alternatywne strumienie danych były popularne.

Niezwykłe postacie

Wrzucę to tylko dla kopnięć. Stara sztuczka IRC polegająca na podszywaniu się pod inne osoby polegała na stworzeniu nazwy z literami, które wyglądają podobnie do nazwiska innej osoby. Możesz tego użyć w znakowaniu wodnym. Mapa znaków w systemie Windows daje wiele nietypowych znaków, które wyglądają podobnie do litery lub cyfry, których możesz użyć w kodzie źródłowym, ale nie są. Te pojawianie się w konkretnym miejscu w czyjejś pracy nie może być przypadkowe.

Zaufane sygnatury czasowe

Krótko mówiąc, wysyłasz plik (lub jego skrót) do osoby trzeciej, która następnie dodaje do niego znacznik czasu i podpisuje go kluczem prywatnym. Każdy, kto chce udowodnić, kiedy utworzyłeś dokument, może udać się do zaufanej strony trzeciej, często strony internetowej, w celu zweryfikowania czasu utworzenia dokumentu. Były one wykorzystywane w sprawach sądowych w sporach dotyczących własności intelektualnej, więc stanowią bardzo mocną formę dowodu. To standardowy sposób na uzyskanie dowodu, którego szukasz. (Inne dołączyłem jako pierwsze, bo są łatwe, są fajniejsze i prawdopodobnie będą działać.)

Ten artykuł w Wikipedii może pomóc instruktorowi zrozumieć Twoje dowody, a sekcja linków zewnętrznych ma wielu dostawców, w tym bezpłatnych. Przetestowałem pliki testowe przez darmowe przez kilka dni, zanim użyłem ich do czegoś ważnego.

Modus operandi

Więc coś zrobiłeś i teraz masz dowód, prawda? Nie, uczniowie nadal mogą powiedzieć, że ukradłeś im pomysł lub inne bzdury. Moją poprawką było ustalenie na osobności jednej lub więcej moich metod z moim instruktorem. Mówię instruktorowi, aby szukał białych znaków, szukał określonych symboli itp., Ale aby nigdy nie mówił innym, czym był znak wodny. Jeśli instruktor zgodzi się zachować twoje proste techniki w tajemnicy, prawdopodobnie będą nadal działać dobrze. Jeśli nie, zawsze istnieje zaufany znacznik czasu. ;)

Nick P
źródło
5
+1 - Ładna, wyczerpująca odpowiedź. Prawdopodobnie powinna to być akceptowana odpowiedź.
Andy Thomas
5
Jeszcze jeden pomysł: zakoduj swoje inicjały w nazwach zmiennych, nazwach pól, nazwach metod, nazwach klas itp. Złodziejowi trudno będzie wszystko przepisać. (Wspomniałem o tym tutaj, bo to dobra kolekcja)
gaborsch
1
+1 GaborSch. To miły dodatek. Jeśli nie stracisz punktów za niejednoznaczne nazwy metod, możesz w ten sposób uczynić taktykę mniej oczywistą, a same inicjały mogą być rozłożone w nazwach.
Nick P
4
Kolejny pomysł zainspirowany komentarzem GaborScha: celowe błędne pisanie pewnych rzeczy. Wykonaj bardzo rzadki błąd w pisowni nazwy funkcji lub zmiennej. 10 innych osób zrobiło to samo samodzielnie? Tak, zgadza się ... (Uwaga: jeden z wybitnych krytyków tłumaczenia Biblii Nowego Świata twierdził, że to podróbka KJV, a dowody były takie, że rzadki błąd gramatyczny w KJV był w „zupełnie nowym” NWT. Tak więc istnieje precedens dla tej pracy. )
Nick P
7
Należy zwrócić uwagę na „białe znaki wodne”, że jeśli IDE (przeformatuje) kod (np. VS C # / Eclipse), zniknie.
Alvin Wong
63

Gdyby twoi koledzy z klasy ukradli Twój kod z witryny do przesyłania, zaszyfrowałbym twoją pracę domową i wysłałbym klucz e-mailem do nauczyciela. Możesz to zrobić za pomocą PGP, jeśli chcesz być skomplikowany lub coś tak prostego, jak plik Zip z hasłem.

EDYCJA: PGP pozwoliłoby na szyfrowanie / podpisywanie bez ujawniania klucza, ale nie można pokonać prostoty ścinania pliku Zip z hasłem, więc po prostu wybieraj nowy klucz przy każdym zadaniu domowym. Piękno w prostocie :)

Jonathan S. Fisher
źródło
2
To najprostsze rozwiązanie.
Jon Raynor
2
Jak udowodnisz, że kod jest Twój? Mogę ukraść twój kod i zipować tak, jakby to był mój.
gaborsch
4
@GaborSch, jeśli prześlę swój kod do pliku zip z hasłem, zobaczę twoją skradzioną wersję wkrótce po
upalnej
11
Możesz udowodnić, że to Twój kod, podając klucz odszyfrowywania.
Jonathan S. Fisher
10
Jasne, w teorii jest wiele luk, ale realistycznie jest mało prawdopodobne, aby ktokolwiek uzyskał dostęp do swoich plików, jeśli wyśle ​​je w postaci zaszyfrowanej: są granice tego, jak daleko by się posunęli i są granice ich możliwości. Jeśli nie uda im się napisać GUI do odrabiania pracy domowej, jest szansa, że ​​w najbliższym czasie nie będą łamać haseł ani włamać się do żadnego komputera.
Supr
39

Jeśli dajesz nauczycielowi kod źródłowy, po prostu dodaj serialVersionUIDdo jednego z plików klasowych zaszyfrowaną wersję Twojego imienia i nazwiska. Możesz samodzielnie odszyfrować go nauczycielowi.

To nic nie znaczy dla innych, tylko dla ciebie. Możesz powiedzieć, że to wygenerowany kod, jeśli go kradną, prawdopodobnie w ogóle nie zawracają sobie głowy jego modyfikacją.

Jeśli chcesz to zrobić w stylowy sposób, możesz użyć tej sztuczki , jeśli znajdziesz przypadkowe ziarno, które produkuje twoje imię. :) To byłby wtedy twój numer i gdziekolwiek by się pojawił, to udowodniłoby, że to ty stworzyłeś ten kod.

gaborsch
źródło
5
Złodziej może wprowadzić kosmetyczne zmiany w kodzie, aby kradzież była mniej oczywista. UID wersji seryjnej byłby łatwą kosmetyczną zmianą.
Andy Thomas
3
@GaborSch ten z serialVersionUID jest doskonały, dziękuję
LoremIpsum
2
@ AndyThomas-Cramer tak, powinienem zaprogramować metodę z moją zaszyfrowaną nazwą i jeśli zostanie usunięta, program nie będzie działał haha
LoremIpsum
2
@ AndyThomas-Cramer Teoretycznie tak. W praktyce większość oszustów jest leniwa i robi tylko absolutne minimum, które uważają za konieczne. (Prawdopodobnie zastąpi //written by WarGodNTje //Written by ImaCheata.) Jest również mało prawdopodobne, aby wielu z nich wiedziało, że svUID może je zniszczyć. Nawet jeśli kilka z nich jest tak sprytnych; jeśli większość klasy oszukuje, kilku z pewnością zostanie złapanych. Powinno to przynajmniej wystarczyć do przekonania nauczyciela, aby nie wyjaśniał swojego procesu.
Dan Is Fiddling By Firelight
3
@WilQu: Nie będziesz podpisywać własnego kodu przy użyciu cudzego imienia lub klucza prywatnego, prawda?
Unslander Monica
35

Stało się to z parą moich uczniów, którzy mieszkali w tym samym mieszkaniu. Jeden ukradł kod źródłowy z dysku pozostawionego w szufladzie biurka.

Złodziej nieznacznie zmodyfikował skradzione źródło, żeby nie było to oczywiste. I tak zauważyłem podobieństwo kodu i sprawdziłem źródło w edytorze. Niektóre linie miały dodatkowe spacje na końcach. Źródło każdego ucznia miało taką samą liczbę dodatkowych spacji.

Możesz to wykorzystać do kodowania informacji bez pokazywania ich. Możesz zakodować swoje inicjały lub legitymację studencką na końcach niektórych wierszy ze spacjami.

Złodziej prawdopodobnie dokona kosmetycznych zmian w widocznym kodzie, ale może przeoczyć niewidoczne znaki.

EDYTOWAĆ:

Myśląc o tym trochę więcej, możesz użyć spacji i tabulatorów jako cyfr i dah w alfabecie Morse'a i umieścić swoje imię na końcu wielu linii. Złodziej może usunąć, zmienić kolejność lub przepisać niektóre wiersze bez niszczenia Twojej identyfikacji.

EDYCJA 2:

„Steganografia białych znaków” to termin oznaczający ukrywanie wiadomości w białych znakach. Wyszukiwanie w Google ujawnia tę implementację typu open source z lat 90., przy użyciu kodowania Huffmana zamiast kodu Morse'a.

Andy Thomas
źródło
2
Nie ma za co, dziękuję za pytanie. Dał mi możliwość pomyśleć o odstępach alfabetu Morse'a.
Andy Thomas
1
Każde środowisko Java IDE może sformatować kod, usuwając wszystkie niewidoczne znaki ;-) Mimo to pomysł na kod Morse'a jest fajny :-)
Prakash K
5
Rozszerzenie: w dowolnym literale ciągu zamień niektóre spacje na znak, który wygląda jak pusty. Podobnie jak znak # 255 w ASCII lub „niezapisywalny odstęp” w Unicode. Większość początkujących nie zauważy różnicy, a to pozwoli ci wskazać, kto (prawdopodobnie!) Ukradł twoje źródła.
TheBlastOne
@PrakashK - Tak, to by przeciwdziałało temu środkowi. Prawdopodobnie najlepsza jest kombinacja środków.
Andy Thomas
@TheBlastOne - Niezły pomysł. Sam Cię nie identyfikuje, ale nie jest tracony, jeśli złodziej się przeformatuje.
Andy Thomas
19

Wydaje mi się, że jest to problem z administracją IT. Każdy uczeń powinien mieć własny obszar przesyłania, do którego nie mają dostępu inni uczniowie.

Nauczyciel byłby na wyższym poziomie, mając dostęp do każdego folderu przesyłania uczniów. Jeśli nie jest to możliwe, wybierz odpowiedź @exabrial, ponieważ jest to najprostsze rozwiązanie.

Jon Raynor
źródło
9

Najlepsze, co możesz zrobić, to po prostu spakować kod źródłowy z hasłem i wysłać je e-mailem do nauczyciela.

Problem rozwiązany.

Omid
źródło
2
+1 do prostych rozwiązań. Nie przesadzaj. Ale najpierw zapytaj profesora, czy nie ma nic przeciwko temu.
Eduardo
6

Użyj rozproszonego (= samodzielnego) systemu kontroli wersji , takiego jak git . Może się też przydać.

Historia wersji z Twoim imieniem i datami może być wystarczająco przekonująca.

Joop Eggen
źródło
2
Ale OP nie omieszka udowodnić, że jego źródło zostało stworzone przez niego. Trudno mu udowodnić, że koledzy ze szkoły używają jego źródeł do swoich.
TheBlastOne
2
Rozproszony system VCS jest dość złożony. Jedyne, czego potrzebuje autor, to udowodnienie oryginalności treści i / lub kopiowania. Można to osiągnąć za pomocą dowolnego mechanizmu przesyłania plików, który sygnalizuje przesłanie, identyfikuje przesyłającego i nie pozwala uczniom na usuwanie zgłoszeń. Można to zrobić za pomocą czegoś tak prostego, jak serwer FTP lub serwer WWW.
Nick P
1
Bardzo łatwo jest napisać skrypt, który przeskanuje dziennik zatwierdzeń i odtworzy nowe repozytorium z tą samą historią, ale innym użytkownikiem.
mikerobi
@mikerobi git filter-branchzostał zbudowany do takich szalonych rzeczy, które nie powinny być łatwe
Izkata
@Izkata, nie rozważałem możliwości zmiany historii zmian. Myślałem o skrypcie, który pobiera pierwszą wersję i zatwierdza ją do innego repozytorium, a następnie sprawdza drugą wersję i łata nowe repozytorium, zatwierdzenia, powtarza. Podobnie jak działają niektóre narzędzia do konwersji z jednego systemu VCS na inny.
mikerobi
3

Co zostało skradzione?

  • Źródło ? Możesz umieścić w nim losowe struny (ale można to zmienić). Możesz także spróbować dodać specjalne zachowanie znane tylko od Ciebie (specjalne naciśnięcie klawisza zmieni kolor w rzędzie), możesz wtedy zapytać nauczyciela „inni znają tę specjalną kombinację?”. Najlepszym sposobem będzie zawieszenie programu, jeśli po 5 minutach aktywności w archiwum nie ma pustego, bezużytecznego pliku, twoi koledzy ze szkoły będą zbyt leniwi, aby czekać tak długo.

  • Binarny? Wystarczy porównać sumę kontrolną każdej klasy .class (Twoi koledzy ze szkoły są zbyt leniwi, aby przepisać pliki klas)

Kartoch
źródło
2

Po prostu opublikuj swoje rozwiązanie w ostatniej chwili. To nie da czasu nikomu na skopiowanie.

I wyślij opinię do administratora, aby uniemożliwić uczniom przeglądanie projektów innych uczniów.

Eduardo
źródło
1

Jeśli prześlesz plik w formacie .zip z zaszyfrowanym hasłem, każdy może po prostu złamać hasło, pobierając plik .zip i zlecić procesorowi wykonanie miliona zapytań, jeśli jest tak wielkim złodziejem oszustów. Niestety, niektóre są i łatwo to zrobić.

Twoje źródło może być przeglądane na udostępnionym serwerze przez innych uczniów. Nauczyciel naprawdę powinien dać ci własny zaszyfrowany katalog do przesłania hasła. Można to łatwo zrobić, dodając subdomeny. Ale być może nauczyciel pozwoli ci przesłać pliki na własny serwer, aby mógł tam uzyskać do nich dostęp.

Możliwe jest również zaciemnienie skryptu, aby zawierał plik document.write („Ta strona została napisana przez xxxxx”), zmuszając każdego, kto kopiuje Twoją pracę, do niemożności usunięcia informacji o autorze, chyba że najpierw je odszyfruje. Ale prawdziwa odpowiedź jest taka, że ​​Twoja szkoła musi zapewnić każdemu uczniowi własny katalog chroniony hasłem.

michael d
źródło
0

W moim przypadku moi nauczyciele przyszli z lepszym podejściem. Pytania, które zadali, mają coś wspólnego z naszym numerem rejestracyjnym. Dawny:

Dane wejściowe do funkcji / teorii to nasz numer rejestracyjny, który jest inny dla każdego ucznia

Tak więc odpowiedzi lub podejście do rozwiązania są stosunkowo różne u każdego ucznia. To sprawia, że ​​wszyscy uczniowie muszą koniecznie samodzielnie odrabiać pracę domową lub przynajmniej dowiedzieć się, jak zhakować podejście z własną rejestracją. może być trudniejsze niż nauczenie się lekcji;)].

Hope your lecturer will read this thread before his next tutorial :D
Chand Priyankara
źródło