上周,我不得不为家庭作业创建一个小图形用户界面。我的同学都没有做过。他们从我们上传的地方偷了我的一个,然后又以他们的身份上传了。当我告诉老师这都是我的工作时,他不相信我。
所以我想把一个无用的方法或者其他东西放进一个证明,我把它编码了。我想到了加密。到目前为止我最好的主意是:
1
| String key = ("ZGV2ZWxvcGVkIGJ5IFdhckdvZE5U"); //My proof in base64 |
你能想出其他更好的方法吗?
- 开发一种独特的编码风格,如果被别人复制,你会注意到,你的老师也会…有希望地
- 文件在上传站点上没有时间戳吗?
- 你是说他们可以从你上传的地方下载你的代码吗?这似乎很疯狂。你应该质疑老师的方法。最好是和他/她的老板谈话,因为他/她似乎有点不合理。
- 你可以在你的罐子上签名,然后把钥匙交给你的导师来验证它是你的。编辑:哦,有人已经回答了!:)
- 史诗般的失败,你的一个家庭作品,让整个班级失败。
- @keyser我在php课程中遇到了和老师一样的问题:目录public_html必须由apache读取,所以其他学生也可以读取它…
- @我将和老师讨论一个更具体的方法。没有时间戳什么都不像我把它复制到每个人都可以访问的文件夹中
- 好像老师也是个初学者…
- 有几个想法:1)base64是一种编码,而不是一种加密。2)即使你按照你建议的方式输入了一个密钥,有什么能阻止他们用自己的密钥替换它,甚至只是删除它?3)真正的问题似乎是分配系统允许复制和粘贴。显然,它不符合"安全约束"(可能不是正确的行话,我不是安全专家),可以将其定义为"学生不应该能够访问彼此的解决方案"。你知道他们是怎么偷的吗?
- 只要在截止日期的最后一分钟内上传您的解决方案,您的"同事"就无法如此快速地复制和粘贴您的解决方案并重新加载。
- 他们是1:1复制的,还是复制和修改的?在后一种情况下,最好的方法是使算法过于复杂。或者,在截止日期前上传一个有细微缺陷的"蜜罐",稍后用合适的解决方案覆盖它。
- @托比亚斯-使算法过于复杂,往往会损害您自己的成绩。
- @托比亚斯·乌,他们抄了将近1:1,那个拿着蜜罐的是天才,哈哈,我要把他们都抓起来。)
- 如果你需要用技巧来做作业,那门课上的某些东西就会变坏。
- 在这种情况下,唯一明智的做法是尝试通过与老师讨论如何上传作业来纠正问题。把它上传到一个你可以下载其他人提交的材料的地方是很愚蠢的-我不确定一个认为这种方法是好方法的老师应该真的在教学!
- 只需通过代码模糊器运行代码。让它最大限度地模糊事物。这应该会让它难看。如果这不让您高兴,那么您可以编写自己的自定义类加载器来加载加密类(请参见:javaworld.com/javaqa/2003-05/01-qa-0509-jcrypt.html)。页面=1)。您甚至可以让它将源存储在加密文件中,如果您自己设置格式的话。然后用电子邮件把钥匙给你的老师。如果你这样做,我想你可以开始逃课了。定期进行。:)
- 如果您知道您/他们都在使用Windows,您可以简单地将源文件的换行符更改为Unix换行符。这很容易检查,没有人会注意到。
- @卡尔斯普林,如果欧普想在他的工作上获得额外的荣誉,那就不会工作得太好。
- @Wargodnt,如果你做了签名/证明的事情,那么我希望你能回来,告诉我们结果如何!我很想知道他们被烧得有多严重。作弊已经够糟糕的了,但实际上,偷了一个同学的作业,并因此而获得学分是很低的。你要做那样的事,你得做多少无用的混蛋?如果他们不做这项工作,为什么还要学习呢?如果他们连自己的家庭作业都做不到,作为程序员,他们希望发展什么样的职业?很抱歉被激怒了,当人们如此自私自利的时候,我很生气:/
- 遗憾的是,我没有家庭作业,因为我有一个Java考试。但是下一次我们必须上传我们的源代码时,我会选择你们给我的一个很棒的想法,然后把它们都困住。然后我会回来告诉你这个故事。不得不说我是新来的,所以这是一个很好的社区。从未有过如此多的官样文章和有用的想法汇集在一起,谢谢!
- 如果你想知道这一点,不要告诉莫江。
- 也许老师不诚实。我们有一位语言老师允许我们作弊,这样她看起来就不会像以前那么坏了。
- 如果您将其复制到常规目录中,很可能会有时间戳。
- 让你的老师问学生关于代码的问题,毕竟,你很可能理解它,但他们不理解,对吗?
- @赫尔特·洛夫,我会的!!!!
很久以前我和你有同样的问题。我们有Windows2000机器,把文件上传到一个新的网络文件夹,每个人都能看到。我用了几个技巧打败了最好的窃贼:空白水印;元数据水印;不寻常的字符;可信的时间戳;惯用操作。这是按顺序排列的。
空白水印:
这是我对水印的原始贡献。我需要一个在文本文件中工作的不可见水印。我想到的技巧是在编程语句(或段落)之间放入一个特定的空白模式。对他们来说,这个文件看起来是一样的:一些编程语句和换行符。仔细选择文本将显示空白。每个空行包含一定数量的空格,这些空格显然不是随机的或偶然的。在实践中,这种方法为我做了工作,因为他们不知道我在文档中嵌入了什么。
元数据水印
这是更改文件元数据以包含信息的地方。您可以将您的名称、哈希等嵌入到文件的未公开部分,尤其是exe文件中。在NT时代,替代数据流很流行。
不寻常的字符
我把这个扔进去只是为了好玩。一个古老的IRC模仿技巧是用与他人名字相似的字母来命名。你可以在水印中使用它。Windows中的字符映射将为您提供许多与源代码中可能使用的字母或数字相似但不相似的异常字符。在别人的工作中出现在某个特定地点,这不是偶然的。
可信时间戳
简而言之,您将一个文件(或其哈希)发送给第三方,然后第三方将一个时间戳附加到该文件,并用一个私钥对其进行签名。任何需要文档创建时间证明的人都可以访问受信任的第三方(通常是网站),以验证您的创建时间证明。这些证据已被用于知识产权纠纷的法庭案件中,因此它们是一种非常有力的证据形式。它们是完成你所寻找证据的标准方法。(我包括了其他的第一个B/C他们很容易,他们更有趣,可能会工作。)
这篇维基百科文章可能会帮助你的导师理解你的证据,外部链接部分有很多提供者,包括免费提供者。在将测试文件用于重要的事情之前,我会在免费的测试文件中运行几天。
操作手法
所以,你做了一些事情,现在你有证据了,对吗?不,学生们仍然可以说你从他们那里偷走了这个想法或者其他一些胡说八道。我解决这个问题的方法是,私下里,和我的导师建立一个或多个方法。我告诉教员要寻找空白,寻找某些符号等,但不要告诉其他人水印是什么。如果教练同意保守你的简单技巧秘密,他们可能会继续工作良好。如果没有,那么总是有可信的时间戳。;)
- +1-很好,回答全面。可能应该是公认的答案。
- 一个好的文本编辑器将使这种"水印"方法变得明显。
- 你非常欢迎的教友。@G33KZ0R如果他们正在寻找它,它可以,但是有多少懒惰的窃取源程序,你知道,自发决定突出正常外观的换行符,计算其中的空间数量,并在其中寻找数学模式?或者用字符映射单独分析源代码中的字母?通常只是…不会发生的。我称之为使用懒惰者的主要特点反对他们。;)
- 还有一个想法:用变量名、字段名、方法名、类名等来编码您的首字母。窃贼很难重写所有内容。(我在这里提到过,因为这是一个很好的收藏)
- +1夸布施。这是一个很好的补充。如果你不为模棱两可的方法名打分,那么这种方法就不那么明显了,名字的首字母也可以在名称中传播。
- 加博施的另一个观点启发了我们:故意拼错某些东西。对某些函数或变量名进行非常罕见的拼写错误。其他10个人自己做同样的事?是的…(注:新世界圣经翻译的一位著名批评家声称这是KJV的仿制品,证据是KJV中罕见的语法错误出现在"全新"的NWT中。所以,这项工作有一个先例。)
- @尼克,你的意思是说像sercive而不是service?好主意,证明了共同的来源,但不能证明你是发起人。不管怎样,很好的水印。
- 这就是可信时间戳的用途。;)哦,我过去为了避免可信的加密时间戳,曾经用过的一件事就是给自己发送基于网络的电子邮件或私人论坛消息。每一个都有一个由第三方控制的时间戳。因此,它们可以创建一个可信的、免费的、可靠的时间戳,尽管不安全。已经足够说服过去喜欢让我在他们面前打开一个网页作为证据而不是繁琐的验证的第三方了。
- 这对任何寻找可信时间戳链接的人都很好
- 除此之外,老师还告诉其他人你的计划。也许是个骗子
- 关于"空白水印"的一点需要注意的是,如果IDE(重新)格式化了您的代码(例如vs c/eclipse),它们就会消失。
- 阿尔文说得对。投票赞成。我忘了提一下,在完成代码之后,最好在记事本中做任何基于文本/空白的水印。又是一次很好的接球。
如果你的同学从上传网站上偷走了你的密码,我会加密你的作业,然后把钥匙电邮给老师。如果您想变得复杂,可以使用pgp来实现这一点,或者使用具有密码的zip文件来实现这一点。
编辑:PGP允许您在不泄露密钥的情况下进行加密/签名,但是您不能用密码克服zip文件的剪切简单性,所以每次作业都只需选择一个新的密钥。简洁之美:)
- 谢谢,好主意:)
- 这是最简单的预言。
- 你如何证明代码是你的?我可以偷你的密码,然后像我的一样拉上拉链。
- @加布尔奇,如果我用密码把我的代码上传到一个压缩文件中,我会在太阳热死后不久看到你的被盗版本(用适当选择的密码)。
- @你太乐观了,还有很多其他的方法来获取代码,不仅仅是那个。如果这是唯一的问题,那么上传时间戳就足够了。
- 您可以通过成功地提供解密密钥来证明这是您的代码。
- 证实你的主张,加布尔奇,还有其他什么办法?如果他上传的文件是受密码保护的(即加密的),那么他们就无法从中窃取代码。这就是加密的发明目的。事实证明他是唯一能为老师解密的人。
- 您正在缩小问题范围,每个系统都存在数百万个安全漏洞。例如,op选择弱赢密码,让他的笔记本电脑无人看管,选择弱密码/弱加密到zip,老师在邮箱中使用弱密码,老师在课程中打开他的机器,等等。你认为如果某个东西被加密了,那么它就不能被检索吗?为什么银行安全部门会使用标记墨水来标记被盗的钞票?因为他们也知道,所有的东西都可以被偷走,但是用这种方法,他们会使它毫无价值。标记是关键动力,而不是防御。
- 当然,理论上有许多漏洞,但实际上,如果他加密发送文件,就不太可能有人能访问到他的文件:这些文件的访问范围是有限的,它们的能力也是有限的。如果他们不能为家庭作业写一个图形用户界面,那么他们很可能不会在任何时候破解密码或入侵任何人的电脑。
- 从已经连接的开放式FTP服务器下载文件和物理访问他的(更不用说老师的)计算机之间有很大的区别,就像数字音乐盗版很丰富,但你看不到同样的人从实体商店窃取物理CD。我同意,尽管仍有方法获取文件,但我只是认为该解决方案可以99%确保阻止它:)
- 别赌那个。你需要例子,你明白了。我相信你会误解它,连同你的先入之见,你只会用它来证明你的真理。请阅读别人所说的,打开你的思想,不要坚持一个解决方案。有无数种方法。辩论结束了。
- 我不明白你在抱怨什么。什么先入之见?我想证明什么?我甚至说我同意你还有其他的方法。我只是希望建议的解决方案非常有效,而您似乎暗示这是完全无用的。当然,我不明白你提出的在纯文本代码中嵌入一个简单的、易于移动的加密字符串的解决方案比加密整个交付更有效……
- 好吧,一些误解:我没有说保护您的代码是无用的,我说-如果我们使用这里的建议方法-还有其他方法应该有足够的权力来证明来源。我认为这些标记(任何类型)都很容易识别和移除——同样参见我对nickp答案的最后评论。而且,我仍然不认为简单地用密码保护zip文件中的任何数据就可以对几十个IT学生提供足够的保护。
- 但你不同意加密文件比简单的文本标记(如你所说)更容易被删除吗?当然,密码保护的想法假定他选择了一个有效的方案,而且不容易破解。IT学生是的,但是IT学生甚至不能编写自己的GUI代码…;)
如果你给老师提供源代码,那么只需在你的一个班级文件中添加一个serialVersionUID,它是你名字的加密版本。你可以自己给老师解密。
这对其他人没有任何意义,只是对你而言。你可以说这是一个生成的代码,如果他们窃取了它,可能根本不需要修改它。
如果你想以一种时尚的方式来做,你可以使用这个技巧,如果你找到产生你名字的随机种子。:)那就是你的号码,不管它出现在哪里,都能证明是你写的。
- 问题是我们必须把它上传到公共场所,老师必须能够看到源代码。
- 但他们可能必须提供来源。
- 窃贼可能会对密码进行修饰性的修改,以使盗窃行为不那么明显。一个系列版本的uid将是一个简单的外观改变。
- @加布尔奇,那个有序列号的是完美的,谢谢。
- @Andythomascramer是的,我应该用我的加密名称来编程一个方法,如果它被删除了,程序就不能工作了,哈哈。
- @理论上是的。实际上,大多数作弊者都很懒惰,只做他们认为必要的最低限度的事情。(可能用//Written by ImaCheata代替//written by WarGodNT)他们中的许多人甚至不太可能知道svuid会破坏他们。即使他们中的一些人很聪明;如果大多数人作弊,少数人几乎肯定会被抓住。至少这应该足以说服老师取消他的教学过程。
- @丹妮同意,如果有足够数量的抄袭者,它可能会抓住一些。但是,由于它是高度可见的,经常不需要满足需求,并且很容易被删除或修改,所以我不会将它作为唯一的所有权证明。
- @而且,这总是取决于老师。如果OP证明有很多学生抄袭了他的东西,那就足够了。如果这个serialVersionUID被放到所有类中,那么它也会有所帮助,因此,如果在那里留下任何痕迹,那么窃贼就会被抓住。
- 很容易知道什么时候复制了代码。如果你的教授不认为是抄袭的,相信他们的判断是公平的。
- @威尔克:你不会用别人的名字或私钥来签署你自己的代码吧?
- @不,这就是重点:其他人可以用自己的签名代替作者的签名。签名可以证明您上传了代码,但不能证明您是原始作者。
- @Gaborsch Exabrial建议加密,这与签名不同。通过加密,其他人可以复制您的代码,因为他们无法读取代码,也无法向老师提供密码/密钥。
- @你可以删除它,但在考虑到评论之前,请在你的回答中提到。
- @好的,我正在删除我的评论。
- @Wilqu非常感谢!:)我赞成你的观点,也为你清理这里的烂摊子。
- @威尔曲:我想如果那些学生知道这些,他们就不会偷任何代码了。
- @库保伯是的,你可能是对的。
我的一对学生住在同一间公寓里。其中一个窃取了桌子抽屉里的磁盘上的源代码。
窃贼稍微修改了窃取的来源,这样就不明显了。不管怎样,我注意到代码的相似性,并在一个编辑器中检查了源代码。有些线条的末端有多余的空间。每个学生的来源都有相同数量的额外空间。
您可以利用它对信息进行编码而不使其可见。你可以在一些行尾用空格对你的姓名首字母或学生证进行编码。
窃贼可能会对可见代码进行外观更改,但可能会错过不可见的字符。
编辑:
再考虑一下,您可以使用空格和制表符作为摩尔斯代码DIT和DAH,并将您的名字放在多行的末尾。窃贼可以删除、重新排序或重新键入某些行,而不会破坏您的身份。
编辑2:
"whitespace隐写术"是在空白中隐藏消息的术语。谷歌揭示了这个开源实现可以追溯到90年代,使用哈夫曼编码而不是莫尔斯码。
- 不客气,谢谢你的提问。给了我一个思考莫尔斯电码间距的机会。
- 任何Java IDE都可以格式化代码来移除所有的不可见字符;-莫尔斯电码的想法仍然不错:
- 扩展名:在任何字符串文字中,用看起来像空白的字符替换一些空白。类似于ASCII中的字符255,或Unicode中的"不可展开空白"。大多数新手不会注意到这一区别,它会让你指出谁(可能!)偷了你的资料。
- @Prakashk——是的,这可以抵消这个措施。综合措施可能是最好的。
- @最后一个-好主意。它本身并不能识别你的身份,但如果小偷重新格式化,它不会丢失。
- +一个有趣的想法!
对我来说,这似乎是一个IT管理问题。每个学生都应该有自己的上传区域,其他学生不能访问。
教师将是一个更高的层次,能够访问每个学生上传文件夹。如果不可能,请使用@exabrial答案,因为这是最简单的解决方案。
你能做的最好的事情就是用密码压缩源代码,然后用电子邮件将密码发送给老师。
问题解决了。
- +1到简单的解决方案。不要过度设计。但先和教授商量一下,看他是否同意。
使用分布式(=standalone)版本控制系统,如git。可能也有用。
有您的名字和日期的版本历史可能足够令人信服。
- 但OP并没有不证明他的源头是由他创造的。他很难证明同学们利用他的资料来获取他们的资料。
- 分布式VCS非常复杂。作者所需要的只是证明内容的独创性和/或复制。这可以通过任何文件提交机制来完成,该机制会对提交进行时间戳,标识提交者,并且不允许学生删除提交。这可以通过简单的ftp或web服务器来实现。
- 编写一个脚本来扫描提交日志并重新创建一个具有相同历史但不同用户的新repo非常容易。
- @Mikerobi git filter-branch是为那些疯狂的东西而建造的,这不容易。
- @伊兹卡塔,我没有考虑改变修订历史的可能性。我正在考虑一个脚本,它检查第一个修订版并将其提交给另一个repo,然后检查第二个修订版并修补新repo提交的重复内容。类似于一些工具如何从一个VCS转换到另一个VCS。
- @Mikerobi的问题是,每个提交的时间戳将是相同的。filter-branch保留原
- 都很好,谢谢你对使用风投的想法。(1)VCS是一种好的(非侵入性、非反对性)工具。很简单,commit几乎就足够了。他可能是第一个。(三)有历史发展。(4)它比隐写术更安全(如空格或单词的首字母构成一个名字的注释)。(5)黑客攻击也需要付出努力和时间。(6)它不是傻瓜的证据。
- @izkata、git和mercurial都允许您覆盖提交日期。
什么被偷了?
在最后一分钟公布你的解决方案。这不会给任何人时间去复制它。
并向管理员发送反馈,禁止学生查看其他学生的作业。
如果你用密码加密的.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 |