Protección del acceso al código fuente de Java [cerrado]

96

La semana pasada, tuve que crear una pequeña interfaz gráfica de usuario para la tarea. Ninguno de mis compañeros de escuela lo hizo. Me han robado uno de donde teníamos que subirlo y luego lo han vuelto a subir como suyo. Cuando le dije a mi maestro que era todo mi trabajo, no me creyó.

Entonces pensé en poner un método inútil o algo dentro con una prueba de que lo codifiqué. Pensé en el cifrado. Mi mejor idea hasta ahora:

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

¿Puedes pensar en otras formas mejores?

WarGodNT
fuente
31
¿No tenían los archivos una marca de tiempo en el sitio de carga?
Averroes
76
¿Estás diciendo que podrían descargar tu código desde donde lo cargaste? Eso parece una locura. Deberías cuestionar los métodos del profesor. Preferiblemente hablando con su jefe, ya que parece un poco irracional.
keyer
56
Epic falla en una de tus tareas y deja que toda la clase falle.
celebrado el
25
Parece que el maestro también es un principiante ...
UmNyobe
22
Lo único sensato que puedes hacer en esta situación es tratar de rectificar el problema hablando con el maestro sobre cómo subes tu tarea. Cargarlo en un área donde se pueden descargar los envíos de todos los demás es simplemente estúpido: ¡no estoy seguro de que un maestro que crea que ese enfoque es bueno realmente debería estar enseñando!
Michael Berry

Respuestas:

104

Tuve el mismo problema que tú hace mucho tiempo. Teníamos máquinas con Windows 2000 y cargamos archivos en una carpeta de red Novel que todos podían ver. Usé varios trucos para vencer incluso a los mejores ladrones: marca de agua en espacios en blanco; marca de agua de metadatos; personajes inusuales; sello de tiempo confiable; modus operandi. Aquí los tienes en orden.

Marca de agua de espacios en blanco:

Esta es mi contribución original a las marcas de agua. Necesitaba una marca de agua invisible que funcionara en archivos de texto. El truco que se me ocurrió fue poner un patrón específico de espacios en blanco entre las declaraciones de programación (o párrafos). El archivo les parecía el mismo: algunas declaraciones de programación y saltos de línea. Seleccionar el texto con cuidado mostraría los espacios en blanco. Cada línea vacía contendría una cierta cantidad de espacios que obviamente no son aleatorios ni accidentales. (p. ej., 17) En la práctica, este método funcionó bien porque no pudieron averiguar qué estaba incrustando en los documentos.

Marca de agua de metadatos

Aquí es donde cambia los metadatos del archivo para que contengan información. Puede incrustar su nombre, un hash, etc. en partes invisibles de un archivo, especialmente EXE. En los días del NT, los flujos de datos alternativos eran populares.

Personajes inusuales

Lanzaré este solo por diversión. Un viejo truco de suplantación de IRC consistía en crear un nombre con letras que se parecieran al nombre de otra persona. Puede usar esto en marcas de agua. El mapa de caracteres en Windows le dará muchos caracteres inusuales que se parecen a, pero no lo son, una letra o número que podría usar en su código fuente. Estos que aparecen en un lugar específico en el trabajo de otra persona no pueden ser accidentales.

Sellado de tiempo de confianza

En pocas palabras, envía un archivo (o su hash) a un tercero que luego le agrega una marca de tiempo y lo firma con una clave privada. Cualquiera que desee una prueba de cuándo creó un documento puede acudir al tercero de confianza, a menudo un sitio web, para verificar su prueba de la hora de creación. Estos se han utilizado en casos judiciales para disputas de propiedad intelectual, por lo que son una forma de prueba muy sólida. Son la forma estándar de lograr la prueba que busca. (Incluí los otros primero porque son fáciles, son más divertidos y probablemente funcionarán).

Este artículo de Wikipedia puede ayudar a su instructor a comprender su evidencia y la sección de enlaces externos tiene muchos proveedores, incluidos los gratuitos. Ejecuté archivos de prueba a través de archivos gratuitos durante unos días antes de usarlos para algo importante.

Modus operandi

Entonces, hiciste algo y ahora tienes pruebas, ¿verdad? No, los estudiantes aún pueden decir que les robó la idea o alguna otra tontería. Mi solución para esto fue, en privado, establecer uno o más de mis métodos con mi instructor. Le digo al instructor que busque el espacio en blanco, busque ciertos símbolos, etc. pero que nunca le diga a los demás cuál es la marca de agua. Si el instructor acepta mantener en secreto sus técnicas simples, es probable que sigan funcionando bien. Si no, siempre hay una marca de tiempo confiable. ;)

Nick P
fuente
5
+1 - Buena respuesta completa. Probablemente debería ser la respuesta aceptada.
Andy Thomas
5
Una idea más: codifique sus iniciales en nombres de variables, nombres de campos, nombres de métodos, nombres de clases, etc. El ladrón tendrá dificultades para reescribir todo. (Lo mencioné aquí, ya que es una buena colección)
gaborsch
1
+1 GaborSch. Esa es una buena adición. Si no pierde puntos por nombres de métodos ambiguos, entonces la táctica se puede hacer menos obvia de esa manera y las propias iniciales pueden extenderse dentro de los nombres.
Nick P
4
Otra idea que inspiró el comentario de GaborSch: escribir mal intencionalmente ciertas cosas. Cometer un error ortográfico muy poco común en el nombre de alguna función o variable. ¿Otras 10 personas hicieron lo mismo por su cuenta? Sí, claro ... (Nota: un crítico prominente de la traducción de la Biblia del Nuevo Mundo afirmó que era una imitación de la KJV y la evidencia era que un raro error gramatical en la KJV estaba en la NWT "completamente nueva". Entonces, hay un precedente para este trabajo. )
Nick P
7
Un punto a tener en cuenta sobre las "marcas de agua de espacios en blanco" es que si el IDE (re) formatea su código (por ejemplo, VS C # / Eclipse), desaparecerá.
Alvin Wong
63

Si sus compañeros de clase robaron su código del sitio de carga, cifraría su tarea y enviaría la clave por correo electrónico al maestro. Puede hacer esto con PGP si quiere que sea complicado, o algo tan simple como un archivo Zip con una contraseña.

EDITAR: PGP le permitiría encriptar / firmar sin revelar su clave, pero no puede superar la simple simplicidad de un archivo Zip con una contraseña, así que solo elija una nueva clave en cada tarea asignada. Belleza en la sencillez :)

Jonathan S. Fisher
fuente
2
Este es el método más simple.
Jon Raynor
2
¿Cómo demuestras que el código es tuyo? Puedo robar tu código y comprimirlo como si fuera mío.
gaborsch
4
@GaborSch, si subo mi código a un archivo zip con una contraseña, veré su versión robada poco después de la muerte por calor del sol (con la contraseña elegida apropiadamente)
SeanC
11
Podría probar que era su código proporcionando correctamente la clave de descifrado.
Jonathan S. Fisher
10
Claro, hay muchos agujeros en teoría, pero de manera realista, es poco probable que alguien obtenga acceso a sus archivos si los envía encriptados: hay límites en lo lejos que llegarían y hay límites en sus habilidades. Si no logran escribir una GUI para su tarea, entonces es probable que no descifren contraseñas o pirateen la computadora de nadie en el corto plazo.
Supr
39

Si le está dando el código fuente al profesor, simplemente agregue serialVersionUIDa uno de los archivos de su clase que sea una versión encriptada de su nombre. Puedes descifrarlo tú mismo para el profesor.

Eso no significa nada para los demás, solo para ti. Puede decir que es un código generado, si lo están robando, probablemente no se molestará en modificarlo en absoluto.

Si quieres hacerlo de una manera elegante, puedes usar este truco si encuentras la semilla aleatoria que produce tu nombre. :) Ese sería su número entonces, y dondequiera que aparezca eso probaría que fue usted quien hizo ese código.

Gaborsch
fuente
5
Un ladrón puede realizar cambios cosméticos en el código para que el robo sea menos obvio. Un UID de versión en serie sería un cambio estético fácil.
Andy Thomas
3
@GaborSch el que tiene el serialVersionUID es perfecto gracias a todos
LoremIpsum
2
@ AndyThomas-Cramer sí, debería programar un método con mi nombre encriptado y si se elimina, el programa no funcionará jaja
LoremIpsum
2
@ AndyThomas-Cramer En teoría, sí. En la práctica, la mayoría de los tramposos son perezosos y solo hacen lo mínimo que creen necesario. (Probablemente reemplazando //written by WarGodNTpor //Written by ImaCheata.) También es poco probable que muchos de ellos sepan que el svUID podría destruirlos. Incluso si algunos de ellos son tan inteligentes; si la mayor parte de la clase está haciendo trampa, es casi seguro que algunos serán atrapados. Como mínimo, eso debería ser suficiente para convencer al profesor de que no apruebe su proceso.
Dan Is Fiddling By Firelight
3
@WilQu: No firmará su propio código con el nombre o la clave privada de otra persona, ¿verdad?
Reincorporación a Monica
35

Esto sucedió con un par de mis estudiantes que vivían en el mismo departamento. Uno robó el código fuente de un disco dejado en un cajón del escritorio.

El ladrón modificó ligeramente la fuente robada, para que no fuera obvio. De todos modos, noté la similitud del código y examiné la fuente en un editor. Algunas de las líneas tenían espacios adicionales en los extremos. La fuente de cada alumno tenía el mismo número de espacios adicionales.

Puede aprovechar esto para codificar información sin hacerla visible. Puede codificar sus iniciales o su identificación de estudiante al final de algunas líneas, con espacios.

Es probable que un ladrón realice cambios estéticos en el código visible, pero puede perder los caracteres no visibles.

EDITAR:

Pensando en esto un poco más, podría usar espacios y tabulaciones como dits y dahs en código Morse, y poner su nombre al final de varias líneas. Un ladrón podría quitar, reordenar o volver a escribir algunas líneas sin destruir su identificación.

EDITAR 2:

"Esteganografía de espacios en blanco" es el término para ocultar mensajes en espacios en blanco. Al buscarlo en Google, se revela esta implementación de código abierto que se remonta a los años 90, utilizando la codificación Huffman en lugar del código Morse.

Andy Thomas
fuente
2
De nada, gracias por la pregunta. Me dio la oportunidad de pensar en el espaciado del código Morse.
Andy Thomas
1
Cualquier IDE de Java puede formatear el código eliminando todos los caracteres invisibles ;-) Aún así, la idea del código morse es agradable :-)
Prakash K
5
Extensión: en cualquier literal de cadena, reemplace algunos espacios en blanco con un carácter que parezca un espacio en blanco. Como el carácter # 255 en ASCII, o el "espacio en blanco que no se puede envolver" en Unicode. La mayoría de los novatos no notarán la diferencia y le permitirá indicar quién (¡probablemente!) Robó sus fuentes.
TheBlastOne
@PrakashK - Sí, eso contrarrestaría esta medida. Probablemente lo mejor sea una combinación de medidas.
Andy Thomas
@TheBlastOne - Buena idea. No te identifica por sí solo, pero no se pierde si el ladrón cambia el formato.
Andy Thomas
19

Me parece un problema de administración de TI. Cada estudiante debe tener su propia área de carga a la que no puedan acceder otros estudiantes.

El profesor estaría en un nivel superior, pudiendo acceder a la carpeta de carga de cada alumno. Si esto no es posible, vaya con la respuesta @exabrial, ya que es la solución más simple.

Jon Raynor
fuente
9

Lo mejor que puede hacer es simplemente comprimir el código fuente con una contraseña y enviarla por correo electrónico al profesor.

Problema resuelto.

Omid
fuente
2
+1 a soluciones simples. No exceda la ingeniería. Pero primero consulte con el profesor si está de acuerdo con esto.
Eduardo
6

Utilice un sistema de control de versiones distribuido (= independiente) , como git . También podría ser útil.

Un historial de versiones con su nombre y fechas puede ser suficientemente convincente.

Joop Eggen
fuente
2
Pero OP no deja de demostrar que su fuente fue creada por él. Le cuesta demostrar que sus compañeros de escuela utilizan sus fuentes para las suyas.
TheBlastOne
2
Un VCS distribuido es bastante complejo. Todo lo que necesita el autor es demostrar la originalidad del contenido y / o la copia. Esto se puede lograr con cualquier mecanismo de envío de archivos que marque la fecha del envío, identifique al remitente y no permita que los estudiantes eliminen los envíos. Esto se puede hacer con algo tan simple como un servidor FTP o web.
Nick P
1
Es bastante fácil escribir un script que escanee el registro de confirmación y vuelva a crear un nuevo repositorio con el mismo historial pero con un usuario diferente.
mikerobi
@mikerobi git filter-branchfue creado para cosas tan locas como esa, que no deberían ser fáciles
Izkata
@Izkata, no consideré la posibilidad de cambiar el historial de revisiones. Estaba pensando en un script que verifica la primera revisión y la confirma en otro repositorio, luego revisa la segunda revisión y parchea las confirmaciones del nuevo repositorio, repite. Similar a cómo funcionan algunas herramientas para convertir de un VCS a otro.
Mikerobi
3

¿Qué fue robado?

  • La fuente ? Puede poner cadenas aleatorias en él (pero se puede cambiar). También puede intentar agregar un comportamiento especial que solo usted conoce (una pulsación de tecla especial cambiará una fila de color), luego puede preguntarle al maestro "¿los demás conocen este combo especial?". La mejor manera será bloquear el programa si no hay un archivo inútil vacío en el archivo después de 5 minutos de actividad, sus compañeros de escuela serán demasiado perezosos para esperar esta cantidad de tiempo.

  • ¿El binario? Bastará con comparar la suma de comprobación de cada .class (tus compañeros de escuela son demasiado perezosos para reescribir los archivos de la clase)

Kartoch
fuente
2

Simplemente publique su solución en el último minuto. Esto no le dará tiempo a nadie para copiarlo.

Y envíe un comentario al administrador para no permitir que los estudiantes vean las tareas de otros estudiantes.

Eduardo
fuente
1

Si carga el archivo en un .zip con cifrado de contraseña, cualquiera puede descifrar la contraseña descargando el archivo .zip y hacer que su CPU ejecute un millón de consultas en él si es un gran ladrón de trampas. Desafortunadamente, algunos lo son y es fácil de hacer.

Los otros estudiantes pueden ver su fuente en el servidor compartido. El profesor realmente debería darte tu propio directorio encriptado con contraseña para subir. Esto se puede hacer fácilmente agregando subdominios. Pero quizás el profesor le permita cargar los archivos a su propio servidor para que él pueda acceder a ellos allí.

También es posible ofuscar el script para que tenga un document.write ('Esta página fue escrita por xxxxx'), lo que obliga a cualquiera que copie su trabajo a no poder eliminar el crédito a menos que primero lo descifre. Pero la respuesta real es que su escuela necesita darle a cada uno de sus estudiantes sus propios directorios protegidos con contraseña.

michael d
fuente
0

En mi caso, mis profesores vinieron con un mejor enfoque. Las preguntas que proporcionaron tienen algo que ver con nuestro número de registro. Ex:

La entrada a una función / teoría es nuestro número de registro, que es diferente para cada estudiante.

Entonces, las respuestas o el enfoque de la solución son relativamente diferentes de cada estudiante. Esto hace que la necesidad de todos los estudiantes tenga que hacer sus deberes por su cuenta, o al menos saber cómo hackear el enfoque con su propio registro [it puede ser más difícil que aprender la lesión;)].

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