保护Java源代码不被访问

Lor*_*sum 95 encryption

上周,我不得不为家庭作业创建一个小GUI.我的同学都没有这样做.他们从我们上传它的地方偷了我的那个,然后他们再次上传它们作为他们的.当我告诉老师这是我的全部工作时他并不相信我.

所以我想把一个无用的方法或其他东西放在我编码的证据中.我想到了加密.到目前为止我最好的主意:

String key = ("ZGV2ZWxvcGVkIGJ5IFdhckdvZE5U"); //My proof in base64
Run Code Online (Sandbox Code Playgroud)

你能想到其他更好的方法吗?

Nic*_*k P 103

很久以前我遇到了同样的问题.我们有Windows 2000机器并将文件上传到每个人都可以看到的Novel网络文件夹.我用了几个技巧来击败最好的小偷:空白水印; 元数据水印; 不寻常的人物 可信的时间戳; 作案手法.这是他们的顺序.

空白水印:

这是我对水印的最初贡献.我需要一个在文本文件中工作的隐形水印.我想到的诀窍是在编程语句(或段落)之间添加一个特定的空白模式.该文件看起来与它们相同:一些编程语句和换行符.仔细选择文本将显示空白.每个空行都包含一定数量的空间,这些空间显然不是随机的或偶然的.(例如17)在实践中,这种方法为我做了工作,因为他们无法弄清楚我在文档中嵌入了什么.

元数据水印

您可以在此处更改文件的元数据以包含信息.您可以在文件的看不见的部分嵌入您的名字,哈希等,尤其是EXE.在NT时代,备用数据流很受欢迎.

不寻常的角色

我会把这个扔给踢.一个旧的IRC冒充技巧是使用与其他人名字相似的字母命名.您可以在水印中使用它.Windows中的字符映射将为您提供许多不寻常的字符,这些字符看起来与您在源代码中可能使用的字母或数字类似,但不是.这些出现在别人的工作中的特定位置不是偶然的.

受信任的时间戳

简而言之,您将文件(或其散列)发送给第三方,然后第三方向其添加时间戳并使用私钥对其进行签名.任何想要证明您何时创建文档的人都可以前往受信任的第三方(通常是网站)来验证您的创建时间证明.这些已被用于知识产权纠纷的法庭案件,因此它们是一种非常强有力的证据形式.它们是完成您所寻求的证明的标准方法.(我先把其他人包括在内,但他们很容易,他们会更有趣,也许会工作.)

这篇维基百科文章可能有助于您的教师了解您的证据,而外部链接部分有许多提供者,包括免费提供者.我会通过免费测试文件运行几天,然后再将它们用于重要的事情.

作案手法

那么,你做了什么,你现在有证据吗?不,学生们仍然可以说你从他们或其他一些废话中窃取了这个想法.我对此的解决方法是私下与我的教师建立一个或多个方法.我告诉导师寻找空白,寻找某些符号等,但永远不要告诉其他人水印是什么.如果教师同意将您的简单技术保密,他们可能会继续正常工作.如果没有,那么总会有值得信赖的时间戳.;)

  • 关于"空白水印"的一点要注意的是,如果IDE(重新)格式化你的代码(例如VS C#/ Eclipse),它们就会消失. (7认同)
  • +1 - 很好,全面的答案.可能应该是公认的答案. (5认同)
  • 还有一个想法:用变量名,字段名,方法名,类名等对首字母进行编码.窃贼将很难重写所有内容.(我在这里提到过,因为这是一个很好的收藏) (5认同)
  • 另一个想法GaborSch的评论启发:故意拼错某些事情.执行一些非常罕见的拼写错误的函数或变量名称.其他10个人自己做了同样的事情?是的......(注:新世界圣经翻译的一位着名评论家声称这是一个KJV仿冒品,并且有证据表明KJV中罕见的语法错误是在"全新的"NWT中.所以,这是一个先例. ) (4认同)

Jon*_*her 63

如果你的同学从上传网站上偷了你的代码,我会加密你的作业并把钥匙发给老师.如果您想要复杂,或者像带有密码的Zip文件那样简单,您可以使用PGP执行此操作.

编辑:PGP将允许您加密/签名而不泄露您的密钥,但您无法用密码击败Zip文件的剪切简单性,因此只需在每个作业分配中选择一个新密钥.简约之美:)

  • 您可以通过成功提供解密密钥来证明它是您的代码. (11认同)
  • 当然,理论上存在许多漏洞,但实际上,如果他发送加密文件,任何人都不可能获得访问他的文件:他们将走多远,并且他们的能力有限.如果他们无法为他们的家庭作业设法编写GUI,那么很可能他们不会在任何时候破解密码或黑客入侵任何人的计算机. (10认同)
  • @GaborSch,如果我将我的代码上传到带有密码的zip文件,我会在太阳热死后不久看到你的被盗版本(使用适当选择的密码) (4认同)
  • 这是最简单的应用程序. (2认同)
  • 你如何证明代码是你的?我可以偷你的代码,并像我的一样拉链. (2认同)

gab*_*sch 38

如果您要向教师提供源代码,则只需将其添加serialVersionUID到您的一个类文件中,该文件是您名称的加密版本.你可以自己解密给老师.

这对其他人来说并不意味着什么,只为了你.你可以说它是一个生成的代码,如果它们正在窃取它,可能根本不会费心去修改它.

如果你想以时尚的方式做到这一点,你可以使用这个技巧,如果你找到产生你的名字的随机种子.:)那将是你的号码,无论它出现在哪里都能证明你是谁制作了这些代码.

  • 小偷可能会对代码进行外观修改,使盗窃行为不那么明显.串行版UID将是一个简单的外观变化. (5认同)
  • @GaborSch与serialVersionUID的一个完美谢谢分配 (3认同)
  • @WilQu:你不会用别人的名字或私钥签署你自己的代码,对吗? (3认同)
  • @AndyThomas-Cramer是的,我应该使用我的加密名称编程一个方法,如果它被删除,程序将不会工作哈哈 (2认同)
  • @AndyThomas-Cramer理论上是的.在实践中,大多数作弊者都是懒惰的,只做他们认为必要的绝对最低限度.(可能用`//由ImaCheata写的`取代`//由WarGodNT`编写.)也许他们中的许多人甚至不知道svUID会破坏他们.即使其中一些人那么聪明; 如果大多数班级作弊,几乎肯定会被抓住.至少应该足以说服老师解开他的过程. (2认同)

And*_*mas 35

这发生在一对住在同一间公寓的学生身上.一个人从桌面抽屉里留下的磁盘中偷走了源代码.

小偷稍微修改了偷来的来源,因此不会很明显.我注意到代码的相似性,并在编辑器中检查了源代码.有些线路末端有额外的空间.每个学生的来源都有相同数量的额外空间.

您可以利用它来编码信息而不会使其可见.您可以使用空格在某些行的末尾对首字母或学生ID进行编码.

小偷可能会对可见代码进行外观修改,但可能会错过不可见的字符.

编辑:

考虑到这一点,你可以使用空格和制表符作为莫尔斯码dits和dahs,并将你的名字放在多行的末尾.小偷可以删除,重新排序或重新键入一些行而不会破坏您的身份.

编辑2:

"空白隐写术"是隐藏空白消息的术语.谷歌搜索它揭示了这个开源实现可以追溯到90年代,使用霍夫曼编码而不是摩尔斯电码.

  • 扩展名:在任何字符串文字中,用一个看起来像空白的字符替换一些空格.像ASCII中的字符#255,或unicode中的"unwrappable blank".大多数新手都不会注意到差异,它会让你指出谁(可能!)偷了你的消息来源. (5认同)
  • 欢迎你,谢谢你的提问.让我有机会想到莫尔斯码间距. (2认同)

Jon*_*nor 19

这对我来说似乎是一个IT管理问题.每个学生都应该有自己的上传区域,其他学生无法访问.

老师会更上一层楼,能够访问每个学生上传文件夹.如果这不可能,请使用@exabrial答案,因为这是最简单的解决方案.


Omi*_*mid 9

您可以做的最好的事情就是用密码压缩源代码并通过电子邮件将密码发送给教师.

问题解决了.

  • +1到简单的解决方案.不要过度工程.但是先咨询一下教授是否对他好. (2认同)

Joo*_*gen 6

使用分布式(=独立)版本控制系统,如git.也可能有用.

包含您的姓名和日期的版本历史可能足以令人信服.

  • 但OP并不能证明他的来源是由他创造的.他很难证明同学们使用他的资料. (2认同)
  • 分布式VCS非常复杂.作者的所有需求都是证明内容和/或复制的原创性.这可以通过任何文件提交机制来完成,该机制为提交添加时间戳,识别提交者并且不允许学生删除提交.这可以通过简单的FTP或Web服务器来完成. (2认同)