保护Java源代码不被访问[关闭]


96

上周,我不得不为作业创建一个小GUI。我的同学都没有这样做。他们从我们必须上传的地方偷走了我的那一部,然后又以自己的名字再次上传了。当我告诉老师这是我的全部工作时,他不相信我。

因此,我想到了将无用的方法或某些东西放入我编码过的证明中。我想到了加密。到目前为止,我最好的主意是:

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

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


31
文件在上传站点中没有时间戳吗?
Averroes

76
您是说他们可以从您上传代码的地方下载您的代码吗?太疯狂了 您应该质疑老师的方法。最好与老板交谈,因为他/她似乎有点不合理。
keyer 2013年

56
史诗级的作业失败了,让全班都失败了。
heldt

25
似乎老师也是一个初学者...
UmNyobe

22
在这种情况下,唯一明智的做法是尝试通过与老师讨论您如何上传作业来纠正问题。将其上传到可以下载其他人提交的内容的区域只是愚蠢的-我不确定老师是否真的应该教这种方法是好方法!
Michael Berry

Answers:


104

我很久以前就遇到过同样的问题。我们拥有Windows 2000计算机,并将文件上传到每个人都可以看到的Novel网络文件夹中。我使用了几种技巧来击败最好的盗贼:空白水印;元数据水印;不寻常的字符;值得信赖的时间戳记;作案手法 这是他们的顺序。

空白水印:

这是我对水印的最初贡献。我需要在文本文件中可用的不可见水印。我想到的技巧是在编程语句(或段落)之间放入特定的空格模式。在他们看来,该文件是相同的:一些编程语句和换行符。仔细选择文本将显示空白。每个空行将包含一定数量的空格,这些空格显然不是随机的或偶然的。(例如17)在实践中,这种方法为我完成了工作,因为他们无法弄清楚我在文档中嵌入的内容。

元数据水印

在这里,您可以更改文件的元数据以包含信息。您可以将名称,哈希等嵌入文件的看不见的部分,尤其是EXE。在新台币时代,备用数据流很受欢迎。

不寻常的字符

我将把它扔出去只是为了踢。一个古老的IRC模仿技巧是用看起来与另一个人的名字相似的字母来命名。您可以在水印中使用它。Windows中的“字符映射”将为您提供许多看起来与您在源代码中可能使用的字母或数字相似但不相似的不寻常字符。这些出现在别人工作的特定位置并不是偶然的。

值得信赖的时间戳记

简而言之,您可以将文件(或其哈希)发送给第三方,然后由后者附加时间戳并使用私钥对其进行签名。任何想证明您何时创建文档的人都可以去受信任的第三方(通常是网站)来验证您的创建时间证明。这些已在法庭案件中用于知识产权纠纷,因此它们是非常有力的证据。它们是完成您要寻找的证明的标准方法。(我首先将其他人包括在其中,他们很容易,他们更有趣,并且可能会工作。)

这篇Wikipedia文章可能会帮助您的讲师理解您的证据,并且外部链接部分提供了很多提供商,包括免费的提供商。我会先通过免费文件运行测试文件几天,然后再将它们用于重要的事情。

操作方式

那么,您做了一些事情,现在有了证明对吗?不,学生们仍然可以说您从他们那里偷走了这个主意或其他胡说八道。我的解决方法是私下与教员建立一种或多种方法。我告诉讲师寻找空白,寻找某些符号等,但是从不告诉其他人水印是什么。如果讲师同意对您的简单技巧保密,那么他们可能会继续正常工作。如果没有,总是有值得信赖的时间戳。;)


5
+1-不错,全面的答案。可能应该是公认的答案。
安迪·托马斯

5
还有一个主意:用变量名,字段名,方法名,类名等将姓名缩写编码。小偷很难重写所有内容。(我在这里提到了它,因为它是一个很好的收藏)
gaborsch 2013年

1
+1 GaborSch。这是一个很好的补充。如果您不为模棱两可的方法名称放宽点,则可以使这种方法变得不那么明显,并且可以将缩写本身散布在名称中。
尼克P

4
GaborSch的评论提出了另一个想法:故意拼错某些内容。对某些函数或变量名进行非常少见的拼写错误。还有10个人自己做同样的事情吗?是的...(注:《新世界》圣经翻译的一位著名批评家声称这是一起假冒伪装案,并且有证据表明,新罕布什尔州的一个罕见的语法错误是在“全新”西北机器翻译公司中进行的。因此,这项工作有先例。 )
Nick P

7
关于“空白水印”的注意事项之一是,如果IDE(重新)格式化您的代码(例如VS C#/ Eclipse),它们将消失。
Alvin Wong

63

如果您的同学从上传站点上窃取了您的代码,我会加密您的作业,并将密钥通过电子邮件发送给老师。如果您想很复杂,或者像带密码的Zip文件一样简单,可以使用PGP进行。

编辑:PGP将允许您在不显示密钥的情况下进行加密/签名,但是您无法用密码击败Zip文件的简洁性,因此只需在每次家庭作业中选择一个新密钥即可。简单的美丽:)


2
这是最简单的方法。
乔恩·雷诺

2
您如何证明代码是您的?我可以窃取您的代码,并像我的一样将其压缩。
gaborsch 2013年

4
@GaborSch,如果我将代码上传到带有密码的zip文件中,那么我会在太阳热死后不久(使用正确选择的密码)看到您的被盗版本
SeanC 2013年

11
您可以通过成功提供解密密钥来证明它是您的代码。
Jonathan S. Fisher

10
当然,理论上有很多漏洞,但是实际上,如果有人将其加密发送,则几乎不可能有人获得对其文件的访问权限:文件的传输距离受到限制,并且其能力也受到限制。如果他们无法为自己的家庭作业编写GUI,那么他们很可能不会很快破解密码或侵入任何人的计算机。
2013年

39

如果您要将源代码提供给老师,则只需serialVersionUID在您的一个班级文件中添加一个名称的加密版本即可。您可以自己将其解密给老师。

这对其他人没有任何意义,仅对您而言。您可以说这是一个生成的代码,如果他们正在窃取它,可能根本不会去修改它。

如果您想以一种时尚的方式做到这一点,可以使用此技巧,如果您发现产生您名字的随机种子。:)那将是您的电话号码,无论出现在哪里,都将证明是编写该代码。


5
小偷可能会对密码进行修饰,以使盗窃行为不那么明显。串行版本的UID将是很容易的外观更改。
安迪·托马斯

3
@GaborSch与serialVersionUID的那个是完美的,感谢分配
LoremIpsum 2013年

2
@ AndyThomas-Cramer是的,我应该使用我的加密名称对方法进行编程,如果删除了该方法,则该方法将无法工作哈哈
LoremIpsum 2013年

2
@ AndyThomas-Cramer理论上是。实际上,大多数作弊者都是懒惰的,只做他们认为必要的最低限度的事情。(可能替换//written by WarGodNT//Written by ImaCheata。)许多人甚至都不知道svUID可以破坏它们。即使其中一些人很聪明;如果大多数班级都在作弊,那么几乎肯定会被抓住。至少应该足以说服老师取消对他的程序的限制。
Dan摆弄Firelight

3
@WilQu:您不会用别人的名字或私钥对自己的代码签名,对吗?
恢复莫妮卡

35

这是我一对住在同一公寓的学生发生的。一个人从办公桌抽屉里的磁盘上窃取了源代码。

小偷对偷来的货源做了些微改动,以使其不明显。无论如何,我注意到了代码的相似性,并在编辑器中检查了源代码。有些行的末端有多余的空格。每个学生的来源都有相同数量的额外空间。

您可以利用它来编码信息而不使其可见。您可以在某些行的末尾用空格对姓名缩写或学生证进行编码。

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

编辑:

再想一想,您可以使用空格和制表符作为莫尔斯电码的字符和数字,并将您的名字放在多行的末尾。小偷可以删除,重新排序或重新键入某些行,而不会破坏您的身份。

编辑2:

“空白隐写术”是用于在空白中隐藏消息的术语。谷歌搜索显示了可以追溯到90年代的这种开放源代码实现,使用的是霍夫曼编码而不是莫尔斯电码。


2
不客气,谢谢你的提问。给了我思考摩尔斯电码间隔的机会。
安迪·托马斯

1
任何Java IDE都可以格式化代码以删除所有不可见的字符;-)摩尔斯电码的想法仍然不错:-)
Prakash K

5
扩展名:在任何字符串文字中,将某些空格替换为看起来像空格的字符。类似于ASCII中的字符#255,或Unicode中的“不可包裹的空白”。大多数新手不会注意到它们之间的区别,它可以让您知道谁(可能是!)偷了您的资源。
TheBlastOne

@PrakashK-是的,这将抵消这一措施。多种措施的组合可能是最好的。
安迪·托马斯

@TheBlastOne-好主意。本身并不能识别您的身份,但是如果小偷重新格式化,它也不会丢失。
安迪·托马斯

19

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

老师将具有更高的级别,可以访问每个学生的上载文件夹。如果不可能,请使用@exabrial答案,因为这是最简单的解决方案。


9

您能做的最好的事情就是用密码压缩源代码,然后将密码通过电子邮件发送给老师。

问题解决了。


2
+1为简单的解决方案。不要过度设计它。但是请先与教授确认一下是否可以。
Eduardo

6

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

带有您的姓名和日期的版本历史可能会令人信服。


2
但是OP并不能证明他的来源是他创造的。他很难证明同学们将他的资源用作他们的资源。
TheBlastOne

2
分布式VCS非常复杂。作者所需要的只是证明内容和/或复制的原创性。这可以通过任何带有时间戳记,确定提交者并且不允许学生删除提交的文件提交机制来完成。这可以通过简单的FTP或Web服务器来完成。
Nick P

1
编写脚本将很容易,它将扫描提交日志并使用相同的历史记录但使用不同的用户来重新创建新的存储库。
mikerobi

@mikerobi git filter-branch是为诸如此类的疯狂事物
-Izkata

@Izkata,我没有考虑更改修订历史记录的可能性。我在考虑一个脚本,该脚本签出第一个修订并将其提交到另一个仓库,然后签出第二个修订并修补新仓库的提交,然后重复执行。与某些工具从一个VCS转换到另一VCS的工作方式类似。
mikerobi

3

被盗了什么?

  • 来源 ?您可以在其中放入随机字符串(但可以更改)。您还可以尝试添加仅了解您的特殊行为(特殊按键会更改颜色行),然后您可以向老师询问“其他人知道此特殊组合吗?”。最好的方法是,如果5分钟的活动后档案中没有空的无用文件,则该程序将崩溃,您的同学将非常懒惰,无法等待大量时间。

  • 二进制?仅比较每个.class的校验和就足够了(您的同学太懒了,无法重写课程文件)


2

只需在最后一分钟发布您的解决方案。这样不会给任何人复制的时间。

并将反馈发送给管理员,以禁止学生查看其他学生的作业。


1

如果您将文件上传到具有密码加密功能的.zip中,那么任何人都可以通过下载.zip文件来破解密码,并让他们的cpu对这个作弊小偷们进行一百万次查询。不幸的是,有些确实很容易做到。

其他学生可以在共享服务器上查看您的源。老师确实应该给您您自己的密码加密目录,以供上载。只需添加子域即可轻松完成。但是也许老师可以允许您将文件上传到您自己的服务器上,以供他在此处访问它们。

还可以对脚本进行混淆处理,使其具有document.write('此页面由xxxxx编写),从而迫使复制您作品的任何人都无法删除信用,除非他们先对其进行解密。但是真正的答案是,您的学校需要为每个学生提供自己的受密码保护的目录。


0

就我而言,我的老师采用了更好的方法。他们提供的问题与我们的注册号有关。例如:

输入功能/理论的是我们的注册号,每个学生的注册号不同

因此,答案或解决方案的方法与每个学生都相对不同。这使得所有学生必须自己完成功课,或者至少了解如何通过自己的注册来破解方法[it可能比学习本课要难;)]。

Hope your lecturer will read this thread before his next tutorial :D
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.