关于加密:保护Java源代码不被访问

Protecting Java Source Code From Being Accessed

上周,我不得不为家庭作业创建一个小图形用户界面。我的同学都没有做过。他们从我们上传的地方偷了我的一个,然后又以他们的身份上传了。当我告诉老师这都是我的工作时,他不相信我。

所以我想把一个无用的方法或者其他东西放进一个证明,我把它编码了。我想到了加密。到目前为止我最好的主意是:

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

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


很久以前我和你有同样的问题。我们有Windows2000机器,把文件上传到一个新的网络文件夹,每个人都能看到。我用了几个技巧打败了最好的窃贼:空白水印;元数据水印;不寻常的字符;可信的时间戳;惯用操作。这是按顺序排列的。

空白水印:

这是我对水印的原始贡献。我需要一个在文本文件中工作的不可见水印。我想到的技巧是在编程语句(或段落)之间放入一个特定的空白模式。对他们来说,这个文件看起来是一样的:一些编程语句和换行符。仔细选择文本将显示空白。每个空行包含一定数量的空格,这些空格显然不是随机的或偶然的。在实践中,这种方法为我做了工作,因为他们不知道我在文档中嵌入了什么。

元数据水印

这是更改文件元数据以包含信息的地方。您可以将您的名称、哈希等嵌入到文件的未公开部分,尤其是exe文件中。在NT时代,替代数据流很流行。

不寻常的字符

我把这个扔进去只是为了好玩。一个古老的IRC模仿技巧是用与他人名字相似的字母来命名。你可以在水印中使用它。Windows中的字符映射将为您提供许多与源代码中可能使用的字母或数字相似但不相似的异常字符。在别人的工作中出现在某个特定地点,这不是偶然的。

可信时间戳

简而言之,您将一个文件(或其哈希)发送给第三方,然后第三方将一个时间戳附加到该文件,并用一个私钥对其进行签名。任何需要文档创建时间证明的人都可以访问受信任的第三方(通常是网站),以验证您的创建时间证明。这些证据已被用于知识产权纠纷的法庭案件中,因此它们是一种非常有力的证据形式。它们是完成你所寻找证据的标准方法。(我包括了其他的第一个B/C他们很容易,他们更有趣,可能会工作。)

这篇维基百科文章可能会帮助你的导师理解你的证据,外部链接部分有很多提供者,包括免费提供者。在将测试文件用于重要的事情之前,我会在免费的测试文件中运行几天。

操作手法

所以,你做了一些事情,现在你有证据了,对吗?不,学生们仍然可以说你从他们那里偷走了这个想法或者其他一些胡说八道。我解决这个问题的方法是,私下里,和我的导师建立一个或多个方法。我告诉教员要寻找空白,寻找某些符号等,但不要告诉其他人水印是什么。如果教练同意保守你的简单技巧秘密,他们可能会继续工作良好。如果没有,那么总是有可信的时间戳。;)


如果你的同学从上传网站上偷走了你的密码,我会加密你的作业,然后把钥匙电邮给老师。如果您想变得复杂,可以使用pgp来实现这一点,或者使用具有密码的zip文件来实现这一点。

编辑:PGP允许您在不泄露密钥的情况下进行加密/签名,但是您不能用密码克服zip文件的剪切简单性,所以每次作业都只需选择一个新的密钥。简洁之美:)


如果你给老师提供源代码,那么只需在你的一个班级文件中添加一个serialVersionUID,它是你名字的加密版本。你可以自己给老师解密。

这对其他人没有任何意义,只是对你而言。你可以说这是一个生成的代码,如果他们窃取了它,可能根本不需要修改它。

如果你想以一种时尚的方式来做,你可以使用这个技巧,如果你找到产生你名字的随机种子。:)那就是你的号码,不管它出现在哪里,都能证明是你写的。


我的一对学生住在同一间公寓里。其中一个窃取了桌子抽屉里的磁盘上的源代码。

窃贼稍微修改了窃取的来源,这样就不明显了。不管怎样,我注意到代码的相似性,并在一个编辑器中检查了源代码。有些线条的末端有多余的空间。每个学生的来源都有相同数量的额外空间。

您可以利用它对信息进行编码而不使其可见。你可以在一些行尾用空格对你的姓名首字母或学生证进行编码。

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

编辑:

再考虑一下,您可以使用空格和制表符作为摩尔斯代码DIT和DAH,并将您的名字放在多行的末尾。窃贼可以删除、重新排序或重新键入某些行,而不会破坏您的身份。

编辑2:

"whitespace隐写术"是在空白中隐藏消息的术语。谷歌揭示了这个开源实现可以追溯到90年代,使用哈夫曼编码而不是莫尔斯码。


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

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


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

问题解决了。


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

有您的名字和日期的版本历史可能足够令人信服。


什么被偷了?

  • 来源?您可以在其中放入随机字符串(但可以更改)。你也可以尝试添加一个只知道你的特殊行为(一个特殊的按键会改变一个颜色行),然后你可以问老师"其他人知道这个特殊组合吗?".最好的方法是让程序崩溃,如果一个空的无用文件在5分钟的活动后没有出现在档案中,你的同学会懒得等这么多时间。

  • 二进制?只需比较每节课的校验和就足够了(你的同学太懒了,无法重写课堂文件)


在最后一分钟公布你的解决方案。这不会给任何人时间去复制它。

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


如果你用密码加密的.zip文件上传,任何人都可以通过下载.zip文件来破解密码,如果他们是一个作弊大盗,他们的CPU就会运行一百万个查询。不幸的是,有些是很容易做到的。

其他学生可以在共享服务器上查看您的源。老师真的应该给你自己的密码加密目录上传。只需添加子域就可以轻松完成这一任务。但也许老师会允许你上传文件到你自己的服务器,让他在那里访问。

还可以混淆脚本,使其具有document.write("此页由XXXXX编写"),强制复制您的工作的任何人在首次解密之前都无法删除信用证。但真正的答案是你的学校需要给每个学生自己的密码保护目录。


在我的例子中,我的老师提出了一个更好的方法。他们提供的问题与我们的注册号有关。前任:

Input to a function/theory is our Registration number, which is
different for each student

因此,答案或解决方案的方法与每个学生都是相对不同的,这使得所有学生都必须自己做作业,或者至少要知道如何利用自己的注册来破解方法[这可能比学习Lession困难;)]。

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