Protezione dall'accesso al codice sorgente Java [chiuso]


96

La scorsa settimana, ho dovuto creare una piccola GUI per i compiti. Nessuno dei miei compagni di scuola l'ha fatto. Hanno rubato il mio da dove dovevamo caricarlo e poi l'hanno caricato di nuovo come loro. Quando ho detto al mio insegnante che era tutto il mio lavoro, non mi ha creduto.

Così ho pensato di inserire un metodo inutile o qualcosa di simile con una prova che lo avevo codificato. Ho pensato alla crittografia. La mia migliore idea fino ad ora:

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

Riesci a pensare ad altri modi migliori?


31
I file non avevano un timestamp nel sito di caricamento?
Averroè

76
Stai dicendo che potrebbero scaricare il tuo codice da dove l'hai caricato? Sembra folle. Dovresti mettere in discussione i metodi dell'insegnante. Preferibilmente parlando con il suo capo poiché sembra essere leggermente irragionevole.
keyser

56
Epic fallisce uno dei tuoi compiti e lascia che l'intera classe fallisca.
tenuto il

25
Sembra che anche l'insegnante sia un principiante ...
UmNyobe

22
L'unica cosa sensata da fare in questa situazione è cercare di correggere il problema parlando con l'insegnante di come carichi i compiti. Caricarlo in un'area in cui è possibile scaricare i contributi di tutti gli altri è semplicemente stupido: non sono sicuro che un insegnante che pensa che l'approccio sia buono dovrebbe davvero insegnare!
Michael Berry

Risposte:


104

Ho avuto lo stesso problema di te molto tempo fa. Avevamo macchine Windows 2000 e caricavamo file in una cartella di rete Novel che tutti potevano vedere. Ho usato diversi trucchi per sconfiggere anche i migliori ladri: watermark con spazi bianchi; filigrana dei metadati; personaggi insoliti; marcatura temporale attendibile; modus operandi. Eccoli in ordine.

Filigrana spazio bianco:

Questo è il mio contributo originale alla filigrana. Avevo bisogno di una filigrana invisibile che funzionasse nei file di testo. Il trucco che mi è venuto in mente è stato inserire uno specifico modello di spazio bianco tra le istruzioni di programmazione (o paragrafi). Il file sembrava loro lo stesso: alcune istruzioni di programmazione e interruzioni di riga. Selezionando attentamente il testo verrà visualizzato lo spazio bianco. Ogni riga vuota conterrebbe un certo numero di spazi che ovviamente non è casuale o accidentale. (es. 17) In pratica, questo metodo ha funzionato per me perché non riuscivano a capire cosa stavo incorporando nei documenti.

Filigrana dei metadati

Qui è dove si modificano i metadati del file per contenere le informazioni. Puoi incorporare il tuo nome, un hash, ecc. In parti invisibili di un file, in particolare EXE. Ai tempi dell'NT, i flussi di dati alternativi erano popolari.

Personaggi insoliti

Lo butto dentro solo per i calci. Un vecchio trucco di imitazione IRC era quello di creare un nome con lettere che assomigliavano al nome di un'altra persona. Puoi usarlo nella filigrana. La mappa dei caratteri in Windows ti darà molti caratteri insoliti che sembrano simili a, ma non lo sono, una lettera o un numero che potresti usare nel tuo codice sorgente. Questi che appaiono in un punto specifico nel lavoro di qualcun altro non possono essere casuali.

Timestamping attendibile

In poche parole, invii un file (o il suo hash) a una terza parte che poi gli aggiunge un timestamp e lo firma con una chiave privata. Chiunque desideri una prova di quando hai creato un documento può rivolgersi a terze parti attendibili, spesso un sito Web, per verificare la tua prova del tempo di creazione. Questi sono stati utilizzati in casi giudiziari per controversie sulla proprietà intellettuale, quindi sono una forma di prova molto forte. Sono il modo standard per ottenere la prova che stai cercando. (Ho incluso prima gli altri b / c sono facili, sono più divertenti e probabilmente funzioneranno.)

Questo articolo di Wikipedia potrebbe aiutare il tuo istruttore a comprendere le tue prove e la sezione dei link esterni ha molti fornitori, compresi quelli gratuiti. Avrei eseguito i file di prova attraverso quelli gratuiti per alcuni giorni prima di usarli per qualcosa di importante.

Modus operandi

Quindi, hai fatto qualcosa e ora hai le prove, giusto? No, gli studenti possono ancora dire che hai rubato loro l'idea o altre sciocchezze. La mia soluzione per questo era, in privato, stabilire uno o più dei miei metodi con il mio istruttore. Dico all'istruttore di cercare gli spazi, cercare certi simboli, ecc. Ma di non dire mai agli altri quale fosse la filigrana. Se l'istruttore accetterà di mantenere segrete le tue semplici tecniche, probabilmente continueranno a funzionare bene. In caso contrario, c'è sempre un timestamp affidabile. ;)


5
+1 - Bella risposta esauriente. Probabilmente dovrebbe essere la risposta accettata.
Andy Thomas

5
Un'altra idea: codifica le tue iniziali in nomi di variabili, nomi di campi, nomi di metodi, nomi di classi, ecc. Il ladro avrà difficoltà a riscrivere tutto. (L'ho menzionato qui, dato che è una buona collezione)
gaborsch

1
+1 GaborSch. Questa è una bella aggiunta. Se non perdi punti per nomi di metodi ambigui, la tattica può essere resa meno ovvia in questo modo e le iniziali stesse possono essere diffuse all'interno dei nomi.
Nick P

4
Un'altra idea ispirata dal commento di GaborSch: alcune cose intenzionalmente sbagliate. Effettua un errore di ortografia molto raro di qualche funzione o nome di variabile. Altre 10 persone hanno fatto la stessa cosa da sole? Sì, giusto ... (Nota: un eminente critico della traduzione della Bibbia del Nuovo Mondo ha affermato che si trattava di un knockoff KJV e la prova era che un raro errore grammaticale in KJV era in "nuovissimo" NWT. Quindi, c'è un precedente per questo lavoro. )
Nick P

7
Un punto da notare sulla "filigrana con spazi bianchi" è che se l'IDE (ri) formatta il codice (ad esempio VS C # / Eclipse), non saranno più disponibili.
Alvin Wong

63

Se i tuoi compagni di classe hanno rubato il tuo codice dal sito di caricamento, crittograferei i tuoi compiti e invierei la chiave per e-mail all'insegnante. Puoi farlo con PGP se vuoi essere complicato, o qualcosa di semplice come un file Zip con una password.

MODIFICA: PGP ti consentirebbe di crittografare / firmare senza rivelare la tua chiave, ma non puoi battere la semplicità di un file Zip con una password, quindi scegli una nuova chiave ogni compito a casa. Bellezza nella semplicità :)


2
Questo è l'approccio più semplice.
Jon Raynor

2
Come fai a dimostrare che il codice è tuo? Posso rubare il tuo codice e zip come se fosse mio.
gaborsch

4
@GaborSch, se carico il mio codice in un file zip con una password, vedrò la tua versione rubata poco dopo la morte per calore del sole (con password opportunamente scelta)
SeanC

11
Potresti provare che era il tuo codice fornendo con successo la chiave di decrittazione.
Jonathan S. Fisher

10
Certo, ci sono molti buchi in teoria, ma realisticamente è improbabile che qualcuno possa accedere ai suoi file se li invia crittografati: ci sono limiti a quanto lontano andrebbero e ci sono limiti alle loro capacità. Se non riescono a scrivere una GUI per i loro compiti, è probabile che non violino le password o non violino il computer di nessuno in tempi brevi.
Supr

39

Se stai fornendo il codice sorgente all'insegnante, aggiungi semplicemente serialVersionUIDa uno dei tuoi file di classe che è una versione crittografata del tuo nome. Puoi decodificarlo per l'insegnante da solo.

Questo non significa niente per gli altri, solo per te. Puoi dire che è un codice generato, se lo stanno rubando, probabilmente non si preoccuperà di modificarlo affatto.

Se vuoi farlo in modo elegante, potresti usare questo trucco , se trovi il seme casuale che produce il tuo nome. :) Allora questo sarebbe il tuo numero , e dovunque appaia che dimostrerebbe che sei stato tu a creare quel codice.


5
Un ladro può apportare modifiche estetiche al codice, per rendere meno evidente il furto. Un UID di versione seriale sarebbe una facile modifica estetica.
Andy Thomas

3
@GaborSch quello con serialVersionUID è perfetto grazie
allot

2
@ AndyThomas-Cramer sì, dovrei programmare un metodo con il mio nome criptato e se viene rimosso il programma non funzionerà haha
LoremIpsum

2
@ AndyThomas-Cramer In teoria sì. In pratica la maggior parte degli imbroglioni è pigra e fa solo il minimo assoluto che ritengono necessario. (Probabilmente sostituendolo //written by WarGodNTcon //Written by ImaCheata.) È anche improbabile che molti di loro sappiano che lo svUID potrebbe romperli. Anche se alcuni di loro sono così intelligenti; se la maggior parte della classe tradisce, alcuni sono quasi certi di essere scoperti. Come minimo, questo dovrebbe essere sufficiente per convincere l'insegnante a smantellare il suo processo.
Dan sta armeggiando alla luce del fuoco

3
@ WilQu: Non firmerai il tuo codice con il nome o la chiave privata di qualcun altro, vero?
Ripristina Monica il

35

È successo con una coppia dei miei studenti che vivevano nello stesso appartamento. Uno ha rubato il codice sorgente da un disco lasciato in un cassetto della scrivania.

Il ladro ha leggermente modificato la fonte rubata, in modo che non fosse ovvio. Ho notato comunque la somiglianza del codice e ho esaminato la fonte in un editor. Alcune delle linee avevano spazi extra alle estremità. La fonte di ogni studente aveva lo stesso numero di spazi extra.

Puoi sfruttarlo per codificare le informazioni senza renderle visibili. Potresti codificare le tue iniziali o il tuo ID studente alla fine di alcune righe, con spazi.

Un ladro probabilmente apporterà modifiche estetiche al codice visibile, ma potrebbe perdere i caratteri non visibili.

MODIFICARE:

Pensandoci un po 'di più, potresti usare spazi e tabulazioni come caratteri in codice Morse e dah e inserire il tuo nome alla fine di più righe. Un ladro potrebbe rimuovere, riordinare o ridigitare alcune righe senza distruggere la tua identificazione.

MODIFICA 2:

"Steganografia degli spazi bianchi" è il termine per nascondere i messaggi negli spazi bianchi. Googling rivela questa implementazione open-source risalente agli anni '90, utilizzando la codifica Huffman invece del codice Morse.


2
Prego, grazie per la domanda. Mi ha dato l'opportunità di pensare alla spaziatura del codice Morse.
Andy Thomas

1
Qualsiasi IDE Java può formattare il codice rimuovendo tutti i caratteri invisibili ;-) Tuttavia l'idea del codice morse è carina :-)
Prakash K

5
Estensione: in qualsiasi stringa letterale, sostituire alcuni spazi vuoti con un carattere che assomiglia a uno spazio vuoto. Come il carattere # 255 in ASCII, o il "vuoto non interpretabile" in Unicode. La maggior parte dei neofiti non noterà la differenza e ti permetterà di indicare chi (probabilmente!) Ha rubato le tue fonti.
TheBlastOne

@PrakashK - Sì, questo contrasterebbe questa misura. Una combinazione di misure è probabilmente la migliore.
Andy Thomas

@TheBlastOne - Bella idea. Non ti identifica di per sé, ma non è perso se il ladro si riformatta.
Andy Thomas

19

Mi sembra un problema di amministrazione IT. Ogni studente dovrebbe avere una propria area di caricamento a cui non possono accedere altri studenti.

L'insegnante sarebbe di livello superiore, potendo accedere alla cartella di caricamento di ogni studente. Se questo non è possibile, vai con la risposta @exabrial in quanto questa è la soluzione più semplice.


9

La cosa migliore che puoi fare è semplicemente comprimere il codice sorgente con una password e inviare la password per e-mail all'insegnante.

Problema risolto.


2
+1 a soluzioni semplici. Non ingegnerizzarlo troppo. Ma prima controlla con il professore se gli va bene.
Eduardo

6

Usa un sistema di controllo della versione distribuito (= autonomo) , come git . Potrebbe essere utile anche.

Una cronologia delle versioni con il tuo nome e le date potrebbe essere sufficientemente convincente.


2
Ma OP non manca di dimostrare che la sua fonte è stata creata da lui. Ha difficoltà a dimostrare che i compagni di scuola usano le sue fonti per le loro.
TheBlastOne

2
Un VCS distribuito è piuttosto complesso. Tutto ciò di cui l'autore ha bisogno è dimostrare l'originalità del contenuto e / o la copia. Ciò può essere ottenuto con qualsiasi meccanismo di invio di file che timestamp l'invio, identifica il mittente e non consente agli studenti di eliminare i contributi. Questo può essere fatto con qualcosa di semplice come un server FTP o web.
Nick P

1
È abbastanza facile scrivere uno script che scansionerà il log di commit e ricrea un nuovo repository con la stessa cronologia ma un utente diverso.
mikerobi

@mikerobi è git filter-branchstato creato per cose folli del genere, non dovrebbe essere facile
Izkata

@Izkata, non ho considerato la possibilità di modificare la cronologia delle revisioni. Stavo pensando a uno script che controlla la prima revisione e la salva in un altro repository, quindi controlla la seconda revisione e corregge il nuovo repository, si ripete, si ripete. Simile a come funzionano alcuni strumenti per convertire da un VCS a un altro.
mikerobi

3

Cosa è stato rubato?

  • La fonte ? Puoi inserire stringhe casuali in esso (ma può essere modificato). Puoi anche provare ad aggiungere un comportamento speciale conosciuto solo da te (una pressione speciale di un tasto cambierà una riga di colore), puoi quindi chiedere all'insegnante "gli altri conoscono questa combinazione speciale?". Il modo migliore sarà mandare in crash il programma se un file vuoto inutile non è presente nell'archivio dopo 5 minuti di attività, i tuoi compagni di scuola saranno troppo pigri per aspettare questa quantità di tempo.

  • Il binario? Sarà sufficiente confrontare il checksum di ogni .class (i tuoi compagni di scuola sono troppo pigri per riscrivere i file della classe)


2

Pubblica la tua soluzione all'ultimo minuto. Questo non darà tempo a nessuno di copiarlo.

E invia un feedback all'amministratore per impedire agli studenti di visualizzare i compiti di altri studenti.


1

Se carichi il file in un file .zip con crittografia della password, chiunque può semplicemente decifrare la password scaricando il file .zip e fare in modo che la propria CPU esegua un milione di query se è un ladro di trucchi. Sfortunatamente, alcuni lo sono ed è facile da fare.

La tua fonte può essere visualizzata sul server condiviso dagli altri studenti. L'insegnante dovrebbe davvero darti la tua directory crittografata con password su cui caricare. Questo potrebbe essere fatto facilmente semplicemente aggiungendo sottodomini. Ma forse l'insegnante potrebbe permetterti di caricare i file sul tuo server per consentirgli di accedervi lì.

È anche possibile offuscare lo script in modo che abbia un document.write ("Questa pagina è stata scritta da xxxxx"), costringendo chiunque copi il tuo lavoro a non essere in grado di rimuovere il credito a meno che non lo decifri prima. Ma la vera risposta è che la tua scuola deve fornire a ciascuno dei suoi studenti le proprie directory protette da password.


0

Nel mio caso, i miei insegnanti sono venuti con un approccio migliore. Le domande che ci hanno fornito hanno qualcosa a che fare con il nostro numero di registrazione. Ex:

L'input per una funzione / teoria è il nostro numero di registrazione, che è diverso per ogni studente

Quindi, le risposte o l'approccio alla soluzione sono relativamente diversi da ogni studente. Questo fa sì che tutti gli studenti debbano necessariamente fare i compiti da soli, o almeno imparare a modificare l'approccio con la propria registrazione [it può essere più difficile che imparare la lezione;)].

Hope your lecturer will read this thread before his next tutorial :D
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.