Protegendo o código-fonte Java contra acesso [fechado]

96

Na semana passada, tive que criar uma pequena GUI para o dever de casa. Nenhum dos meus colegas de escola fez isso. Eles roubaram o meu de onde tínhamos que fazer o upload e, em seguida, carregaram novamente como deles. Quando disse ao meu professor que era tudo meu trabalho, ele não acreditou em mim.

Então pensei em colocar um método inútil ou algo dentro com uma prova de que o codifiquei. Pensei em criptografia. Minha melhor ideia até agora:

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

Você pode pensar em outras maneiras melhores?

WarGodNT
fonte
31
Os arquivos não tinham um carimbo de data / hora no site de upload?
Averroes de
76
Você está dizendo que eles podem baixar seu código de onde você o carregou? Isso parece loucura. Você deve questionar os métodos do professor. De preferência conversando com seu chefe, pois ele parece um pouco irracional.
keyser de
56
Epic reprove um de seus trabalhos de casa e deixe toda a classe reprovar.
realizada em
25
Parece que o professor também é um iniciante ...
UmNyobe
22
A única coisa sensata a fazer nessa situação é tentar retificar o problema conversando com o professor sobre como você carrega seu dever de casa. Enviá-lo para uma área onde você pode baixar os envios de todos os outros é simplesmente estúpido - não tenho certeza se um professor que pensa que essa abordagem é boa deveria realmente estar ensinando!
Michael Berry de

Respostas:

104

Eu tive o mesmo problema que você há muito tempo. Tínhamos máquinas com Windows 2000 e carregamos arquivos para uma pasta de rede da Novel que todos podiam ver. Usei vários truques para vencer até mesmo os melhores ladrões: marca d'água em espaços em branco; metadados watermarking; personagens incomuns; timestamping confiável; modo de operação. Aqui estão eles em ordem.

Marca d'água de espaço em branco:

Esta é minha contribuição original para marcas d'água. Eu precisava de uma marca d'água invisível que funcionasse em arquivos de texto. O truque que eu inventei foi colocar um padrão específico de espaço em branco entre as instruções de programação (ou parágrafos). O arquivo parecia o mesmo para eles: algumas instruções de programação e quebras de linha. Selecionar o texto com cuidado mostraria os espaços em branco. Cada linha em branco conteria um certo número de espaços que obviamente não são aleatórios ou acidentais. (por exemplo, 17) Na prática, esse método funcionou para mim porque eles não conseguiam descobrir o que eu estava incorporando aos documentos.

Marca d'água de metadados

É aqui que você altera os metadados do arquivo para conter informações. Você pode incorporar seu nome, um hash, etc. em partes não vistas de um arquivo, especialmente EXE. Na época do NT, os fluxos de dados alternativos eram populares.

Personagens incomuns

Vou jogar este aqui apenas por diversão. Um antigo truque de personificação do IRC era fazer um nome com letras que se parecessem com o nome de outra pessoa. Você pode usar isso em marcas d'água. O Mapa de Caracteres no Windows fornecerá muitos caracteres incomuns que parecem semelhantes, mas não são, uma letra ou número que você pode usar em seu código-fonte. Essas aparições em um ponto específico no trabalho de outra pessoa não podem ser acidentais.

Registro de data e hora confiável

Resumindo, você envia um arquivo (ou seu hash) a um terceiro que, então, anexa um carimbo de data / hora a ele e o assina com uma chave privada. Qualquer pessoa que deseje uma prova de quando você criou um documento pode ir a um terceiro confiável, geralmente um site da Web, para verificar sua prova de hora de criação. Eles têm sido usados ​​em processos judiciais para disputas de propriedade intelectual, portanto, são uma forma muito forte de evidência. Eles são a maneira padrão de realizar a prova que você está procurando. (Incluí os outros primeiro porque são fáceis, são mais divertidos e provavelmente funcionarão.)

Este artigo da Wikipedia pode ajudar seu instrutor a entender suas evidências e a seção de links externos tem muitos provedores, incluindo alguns gratuitos. Eu executaria arquivos de teste em arquivos gratuitos por alguns dias antes de usá-los para algo importante.

Modo de operação

Então, você fez alguma coisa e agora tem a prova certa? Não, os alunos ainda podem dizer que você roubou a ideia deles ou alguma outra bobagem. Minha solução para isso foi, em particular, estabelecer um ou mais dos meus métodos com meu instrutor. Eu digo ao instrutor para procurar o espaço em branco, procurar certos símbolos, etc., mas nunca dizer aos outros o que era a marca d'água. Se o instrutor concordar em manter em segredo suas técnicas simples, elas provavelmente continuarão a funcionar bem. Caso contrário, sempre haverá um carimbo de data / hora confiável. ;)

Nick P
fonte
5
+1 - Boa resposta abrangente. Provavelmente deve ser a resposta aceita.
Andy Thomas de
5
Mais uma ideia: codifique suas iniciais em nomes de variáveis, nomes de campos, nomes de métodos, nomes de classes, etc. O ladrão terá dificuldade para reescrever tudo. (Eu mencionei isso aqui, pois é uma boa coleção)
gaborsch
1
+1 GaborSch. Essa é uma boa adição. Se você não perder pontos por nomes de métodos ambíguos, a tática pode se tornar menos óbvia dessa forma e as próprias iniciais podem ser espalhadas dentro dos nomes.
Nick P
4
Outra ideia inspirada pelo comentário de GaborSch: erros ortográficos intencionalmente em certas coisas. Cometa um erro de ortografia muito incomum no nome de alguma função ou variável. 10 outras pessoas fizeram a mesma coisa por conta própria? Sim, certo ... (Nota: um crítico proeminente da tradução da Bíblia do Novo Mundo alegou que era uma imitação da KJV e a evidência era que um erro gramatical raro na KJV estava no "novo" NWT. Portanto, há um precedente para este trabalho. )
Nick P
7
Um ponto a ser observado sobre "marca d'água de espaço em branco" é que, se o IDE (re) formatar seu código (por exemplo, VS C # / Eclipse), eles desaparecerão.
Alvin Wong de
63

Se seus colegas roubaram seu código do site de upload, eu criptografaria sua lição de casa e enviaria a chave para o professor. Você pode fazer isso com PGP se quiser ser complicado, ou algo tão simples como um arquivo Zip com uma senha.

EDIT: PGP permite que você criptografe / assine sem revelar sua chave, mas você não pode superar a simplicidade de um arquivo Zip com uma senha, então apenas escolha uma nova chave a cada tarefa de casa. Beleza em simplicidade :)

Jonathan S. Fisher
fonte
2
Este é o método mais simples.
Jon Raynor,
2
Como você prova que o código é seu? Posso roubar seu código e zipar como se fosse meu.
gaborsch de
4
@GaborSch, se eu carregar meu código para um arquivo zip com uma senha, verei sua versão roubada logo após o calor da morte do sol (com a senha escolhida apropriadamente)
SeanC
11
Você poderia provar que era o seu código fornecendo a chave de descriptografia com sucesso.
Jonathan S. Fisher de
10
Claro, existem muitas lacunas na teoria, mas, realisticamente, é improvável que alguém obtenha acesso a seus arquivos se os enviar criptografados: há limites para a distância que eles iriam e para suas habilidades. Se eles não conseguirem escrever uma GUI para seus deveres de casa, é provável que não quebrem senhas ou invadam o computador de ninguém tão cedo.
Supr
39

Se você estiver fornecendo o código-fonte ao professor, basta adicionar a serialVersionUIDa um dos arquivos da sua turma que é uma versão criptografada do seu nome. Você mesmo pode descriptografá-lo para o professor.

Isso não significa nada para os outros, apenas para você. Você pode dizer que é um código gerado; se eles o estiverem roubando, provavelmente não se preocupará em modificá-lo.

Se você quiser fazer isso de uma forma elegante, você pode usar este truque , se você encontrar a semente aleatória que produz o seu nome. :) Esse seria o seu número então, e onde quer que pareça, isso provaria que foi você quem fez aquele código.

gaborsch
fonte
5
Um ladrão pode fazer alterações cosméticas no código, para tornar o roubo menos óbvio. Um UID de versão serial seria uma mudança cosmética fácil.
Andy Thomas de
3
@GaborSch aquele com serialVersionUID é perfeito, obrigado
LoremIpsum
2
@ AndyThomas-Cramer sim, devo programar um método com meu nome criptografado e se for removido, o programa não funcionará haha
LoremIpsum
2
@ AndyThomas-Cramer Em teoria, sim. Na prática, a maioria dos trapaceiros são preguiçosos e fazem apenas o mínimo absoluto que acham necessário. (Provavelmente substituindo //written by WarGodNTpor //Written by ImaCheata.) Também é improvável que muitos deles saibam que o svUID poderia detê-los. Mesmo que alguns deles sejam tão inteligentes; se a maior parte da classe está trapaceando, é quase certo que alguns serão pegos. No mínimo, isso deve ser suficiente para convencer o professor a desfazer o seu processo.
Dan Is Fiddling By Firelight de
3
@WilQu: Você não vai assinar seu próprio código com o nome ou chave privada de outra pessoa, vai?
Reintegrar Monica em
35

Isso aconteceu com um par de meus alunos que moravam no mesmo apartamento. Um roubou o código-fonte de um disco deixado em uma gaveta da mesa.

O ladrão modificou ligeiramente a fonte roubada, para que não fosse óbvio. Percebi a semelhança do código de qualquer maneira e examinei o código-fonte em um editor. Algumas das linhas tinham espaços extras nas extremidades. A fonte de cada aluno tinha o mesmo número de espaços extras.

Você pode explorar isso para codificar informações sem torná-las visíveis. Você pode codificar suas iniciais ou sua carteira de estudante no final de algumas linhas, com espaços.

Um ladrão provavelmente fará alterações cosméticas no código visível, mas pode perder os caracteres não visíveis.

EDITAR:

Pensando um pouco mais nisso, você poderia usar espaços e tabulações como dits e dahs em código Morse, e colocar seu nome no final de várias linhas. Um ladrão pode remover, reordenar ou redigitar algumas linhas sem destruir sua identificação.

EDIT 2:

"Esteganografia de espaços em branco" é o termo usado para ocultar mensagens em espaços em branco. Pesquise no Google para revelar esta implementação de código aberto que remonta aos anos 90, usando a codificação Huffman em vez do código Morse.

Andy Thomas
fonte
2
De nada, obrigado pela pergunta. Me deu a oportunidade de pensar no espaçamento do código Morse.
Andy Thomas de
1
Qualquer IDE Java pode formatar o código removendo todos os caracteres invisíveis ;-) Ainda assim, a ideia do código Morse é boa :-)
Prakash K
5
Extensão: em qualquer string literal, substitua alguns espaços em branco por um caractere que se pareça com um espaço em branco. Como o caractere # 255 em ASCII, ou o "espaço em branco invencível" em Unicode. A maioria dos novatos não notará a diferença, e isso permitirá que você indique quem (provavelmente!) Roubou suas fontes.
TheBlastOne
@PrakashK - Sim, isso iria contra essa medida. Provavelmente, uma combinação de medidas é a melhor.
Andy Thomas de
@TheBlastOne - Boa ideia. Não por si só identifica você, mas não se perde se o ladrão reformatar.
Andy Thomas de
19

Parece um problema de administração de TI para mim. Cada aluno deve ter sua própria área de upload que não pode ser acessada por outros alunos.

O professor ficaria em um nível superior, podendo acessar a pasta de upload de cada aluno. Se isso não for possível, use a resposta @exabrial, pois essa é a solução mais simples.

Jon Raynor
fonte
9

A melhor coisa que você pode fazer é apenas compactar o código-fonte com uma senha e enviar a senha por e-mail para o professor.

Problema resolvido.

Omid
fonte
2
+1 para soluções simples. Não exagere na engenharia. Mas verifique com o professor se ele está bem com isso primeiro.
Eduardo
6

Use um sistema de controle de versão distribuído (= autônomo) , como o git . Pode ser útil também.

Um histórico de versão com seu nome e datas pode ser suficientemente convincente.

Joop Eggen
fonte
2
Mas a OP não deixa de provar que sua fonte foi criada por ele. Ele tem dificuldade em provar que os colegas de escola usam suas fontes para as deles.
TheBlastOne
2
Um VCS distribuído é bastante complexo. Tudo que o autor precisa é provar a originalidade do conteúdo e / ou cópia. Isso pode ser feito com qualquer mecanismo de envio de arquivo que marca a data do envio, identifica o remetente e não permite que os alunos excluam os envios. Isso pode ser feito com algo tão simples como um servidor FTP ou web.
Nick P
1
É muito fácil escrever um script que varrerá o log de commits e recriará um novo repo com o mesmo histórico, mas com um usuário diferente.
mikerobi,
@mikerobi git filter-branchfoi construído para coisas malucas como essa, isso não deve ser fácil
Izkata
@Izkata, não considerei a possibilidade de alterar o histórico de revisão. Eu estava pensando em um script que verifica a primeira revisão e a envia para outro repo, então verifica a segunda revisão e corrige os novos commits do repo, repete. Semelhante a como algumas ferramentas para converter de um VCS para outro funcionam.
mikerobi
3

O que foi roubado?

  • A fonte ? Você pode colocar Strings aleatórios nele (mas pode ser alterado). Você também pode tentar adicionar um comportamento especial conhecido apenas por você (um pressionamento de tecla especial mudará uma linha de cor), você pode então perguntar ao professor "os outros conhecem este combo especial?". A melhor maneira será travar o programa se um arquivo vazio e inútil não estiver presente no arquivo depois de 5 minutos de atividade, seus colegas de escola ficarão com preguiça de esperar esse tempo.

  • O binário? Apenas comparar a soma de verificação de cada .class será suficiente (seus colegas de escola têm preguiça de reescrever os arquivos da classe)

Kartoch
fonte
2

Basta postar sua solução no último minuto. Isso não dará tempo a ninguém para copiá-lo.

E envie um feedback ao administrador para impedir que os alunos vejam as tarefas de outros alunos.

Eduardo
fonte
1

Se você carregar o arquivo em um .zip com criptografia de senha, qualquer pessoa pode simplesmente quebrar a senha baixando o arquivo .zip e ter sua CPU executando um milhão de consultas nele, se for um grande ladrão de trapaça. Infelizmente, alguns são e são fáceis de fazer.

Sua fonte pode ser visualizada no servidor compartilhado pelos outros alunos. O professor realmente deve fornecer a você seu próprio diretório criptografado por senha para fazer o upload. Isso pode ser feito facilmente apenas adicionando subdomínios. Mas talvez o professor possa permitir que você carregue os arquivos em seu próprio servidor para que ele os acesse lá.

Também é possível ofuscar o script para que tenha um document.write ('Esta página foi escrita por xxxxx'), forçando qualquer pessoa que copiar seu trabalho a não ser capaz de remover o crédito, a menos que primeiro o descriptografe. Mas a verdadeira resposta é que sua escola precisa dar a cada um de seus alunos seus próprios diretórios protegidos por senha.

michael d
fonte
0

No meu caso, meus professores vieram com uma abordagem melhor. As perguntas fornecidas têm a ver com nosso número de registro. Ex:

A entrada para uma função / teoria é o nosso número de registro, que é diferente para cada aluno

Portanto, as respostas ou a abordagem para a solução são relativamente diferentes para cada aluno. Isso faz com que, necessariamente, todos os alunos tenham que fazer sua lição de casa por conta própria, ou pelo menos saber como hackear a abordagem com seu próprio registro [it pode ser mais difícil do que aprender a lição;)].

Hope your lecturer will read this thread before his next tutorial :D
Chand Priyankara
fonte