保护Java源代码不被访问

上周,我不得不为作业创build一个小GUI。 我的学校没有一个同学做到了。 他们从我们不得不上传的地方偷走了我的,然后他们再次上传。 当我告诉我的老师,这是我所有的工作,他不相信我。

所以我想把一个无用的方法或者其他东西放在一个certificate我编码的东西里面。 我想到了encryption。 到目前为止,我最好的想法是:

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

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

我和你很久以前都有同样的问题。 我们有Windows 2000机器,并将file upload到每个人都可以看到的Novelnetworking文件夹。 我使用了几个技巧来击败最好的盗贼:空白水印; 元数据水印; 不寻常的人物 可信赖的时间戳; 作案手法。 这是他们的顺序。

空白水印:

这是我原来对水印的贡献。 我需要一个在文本文件中工作的无形水印。 我提出的诀窍是在编程语句(或段落)之间插入特定的空格。 该文件看起来是一样的:一些编程语句和换行符。 仔细select文本将显示空白。 每个空行都会包含一定数量的空格,显然不是随机的或偶然的。 (例如17)在实践中,这个方法为我做了工作,因为他们不知道我在文档中embedded了什么。

元数据水印

这是您更改文件的元数据以包含信息的地方。 你可以在一个文件的不可见部分embedded你的名字,哈希等,尤其是EXE。 在新的一天,备用数据stream是stream行的。

不寻常的字符

我会把这个扔进去踢。 一个老的IRC模仿伎俩是用一个与另一个人的名字相似的字母来命名。 你可以在水印中使用这个。 在Windows中的字符映射会给你许多不寻常的字符,看起来类似于,但不是你可能在源代码中使用的字母或数字。 这些出现在别人工作的特定地点不能是偶然的。

可信时间戳

简而言之,您将文件(或其散列)发送给第三方,第三方然后附加时间戳并用私钥签名。 任何需要certificate您创build文档的人都可以到可信的第三方(通常是网站)来validation创build时间的证据。 这些在知识产权纠纷的法庭案件中被使用,因此是非常有力的证据。 他们是完成您正在寻找的certificate的标准方法。 (我包括其他人第一个B / C他们很容易,他们更有趣,可能会工作。)

这个维基百科文章可能会帮助你的老师理解你的证据,外部链接部分有很多提供者,包括免费的。 我会运行testing文件通过免费的几天之前,使用他们的重要事情。

操作模式

所以,你做了一些事情,现在你有证据了吗? 不,学生仍然可以说你偷了他们的想法或其他废话。 我的解决办法是私下与我的老师build立一个或多个方法。 我告诉教师寻找空白,寻找某些符号等,但永远不会告诉别人水印是什么。 如果教练会同意保持简单的技术秘密,他们可能会继续正常工作。 如果没有,总是有值得信赖的时间戳。 ;)

如果你的同学偷了你的代码从上传网站,我会encryption你的作业,并通过电子邮件发送给老师的密钥。 你可以用PGP做这个,如果你想变得复杂,或者像带有密码的Zip文件一样简单。

编辑:PGP将允许您encryption/签名而不泄露您的密钥,但你不能用密码击败Zip文件的剪切简单,所以只需要每个家庭作业select一个新的密钥。 美在简单:)

如果您将源代码提供给教师,只需将serialVersionUID添加到您的名称的encryption版本的类文件之一即可。 你可以自己解密给老师。

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

如果你想以一种时尚的方式来做,你可以使用这个技巧 ,如果你find随机的种子,产生你的名字。 :)那就是你的电话号码 ,无论哪里出现,都会certificate是这样做的。

这发生在我住在同一间公寓的一对学生。 有人偷走了放在办公桌抽屉里的磁盘的源代码。

窃贼稍微修改了偷来的来源,这样就不会很明显。 我注意到代码的相似性,并在编辑器中检查源代码。 有些行在末尾有额外的空间。 每个学生的来源都有相同数量的额外空间。

你可以利用这个来编码信息而不使其可见。 你可以在你的姓名首字母缩写或者你的学生证号上加上一些空格。

小偷可能会对可见代码进行修饰,但可能会丢失不可见的字符。

编辑:

再想一想,你可以使用空格和制表符作为Morse-code dits和dahs,并把你的名字放在多行的末尾。 小偷可以删除,重新sorting或重新input一些行,而不会破坏你的身份。

编辑2:

“空白隐写术”是隐藏空白信息的术语。 谷歌search它揭示了这个开源实现可以追溯到90年代,使用霍夫曼编码,而不是莫尔斯电码。

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

老师将是一个更高的水平,能够访问每个学生上传文件夹。 如果这是不可能的,请使用@exabrial答案,因为这是最简单的解决scheme。

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

问题解决了。

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

一个包含你的名字和date的版本历史可能足够令人信服。

什么被偷走了?

  • 来源 ? 你可以把随机的string(但可以改变)。 你也可以尝试添加一个只有你自己知道的特殊行为(一个特殊的按键会改变一个颜色行),然后你可以问老师“其他人知道这个特殊的组合?”。 最好的办法是在5分钟的活动后,如果一个空的无用文件没有出现在档案中,程序就会崩溃,你的学校的同学会懒得等待这么多的时间。

  • 二进制? 只是比较每个.class的校验和就足够了(你的学校伙伴懒得重写类文件)

只需在最后一刻发布您的解决scheme。 这不会让任何人复制它。

并发送反馈给pipe理员,禁止学生看到其他学生的作业。

如果你使用密码encryption方式上传.zip文件,任何人都可以通过下载.zip文件破解密码,并且如果他们是一个骗子小偷,他们的CPU会运行一百万个查询。 不幸的是,有些是,这很容易做到。

其他学生可以在共享服务器上查看您的源代码。 老师应该真的给你自己的密码encryption目录上传到。 这可以通过添加子域轻松完成。 但也许老师可能会允许您将file upload到您自己的服务器上,以便他们在那里访问它们。

也可以混淆脚本,使其具有document.write('此页由xxxxx'编写),强制任何复制您的作品的人不能删除信用,除非他们先解密。 但真正的答案是,你的学校需要给每个学生自己的密码保护目录。

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

input一个function/理论是我们的注册号码,每个学生都不一样

所以,答案或解决方法与每个学生都有相对的不同。这使得所有学生都必须自己做功课,或者至less知道如何用自己的注册来破解这个方法[it可能比学习激情更困难;)]。

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