保护Java源代码不被访问

时间:2013-04-17 14:13:18

标签: encryption

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

所以我想把一个无用的方法或其他内容用我编码的证明。我想到了加密。我最好的想法到现在为止:

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

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

11 个答案:

答案 0 :(得分:103)

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

空白水印:

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

元数据水印

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

不寻常的字符

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

可信时间戳

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

This Wikipedia article可能会帮助您的教师了解您的证据,而外部链接部分则包含许多提供者,包括免费提供者。我将测试文件通过免费测试文件运行几天,然后再将它们用于重要的事情。

作案手法

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

答案 1 :(得分:63)

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

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

答案 2 :(得分:38)

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

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

如果你想以时尚的方式做到这一点,你可以使用this trick,如果你找到产生你名字的随机种子。 :)那就是你的号码然后,无论它出现在哪里都会证明是谁制作了这些代码。

答案 3 :(得分:35)

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

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

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

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

修改

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

编辑2:

“Whitespace steganography”是隐藏空白消息的术语。谷歌搜索显示this open-source implementation可以追溯到90年代,使用霍夫曼编码而不是摩尔斯电码。

答案 4 :(得分:19)

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

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

答案 5 :(得分:9)

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

问题解决了。

答案 6 :(得分:6)

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

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

答案 7 :(得分:3)

被盗的是什么?

  • 来源?你可以随机添加字符串(但可以更改)。你也可以尝试添加一个只知道你的特殊行为(一个特殊的按键会改变颜色行),然后你可以向老师询问"其他人知道这个特殊的组合?"。如果活动5分钟后存档中没有空的无用文件,最好的办法就是让程序崩溃,你的学校伙伴会懒得等待这段时间。

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

答案 8 :(得分:2)

请在最后一分钟发布您的解决方案。这不会让任何人有时间复制它。

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

答案 9 :(得分:1)

如果您使用密码加密的.zip文件上传文件,任何人都可以通过下载.zip文件破解密码,如果他们是那个大骗子小偷的话,让他们的cpu运行一百万个查询。不幸的是,有些人很容易做到。

您的来源可以在其他学生的共享服务器上查看。老师应该真的给你自己的密码加密目录上传到。只需添加子域即可轻松完成此操作。但也许教师可能允许您将文件上传到您自己的服务器,以便他在那里访问它们。

还可以对脚本进行模糊处理,使其具有document.write('此页面由xxxxx'编写),强制复制您工作的任何人除非首先解密,否则无法删除信用。但真正的答案是,你的学校需要为每个学生提供自己的密码保护目录。

答案 10 :(得分:0)

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

  

输入函数/理论是我们的注册号,即   每个学生都有所不同

因此,解决方案或解决方案的方法与每个学生相对不同。这使得所有学生必须自己完成家庭作业,或至少知道如何用自己的方法破解方法。注册[可能比学习权利更难;)]。

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