还在悄咪咪抄袭代码的你,已经被这段代码已经出卖了

简介:

悄咪咪抄袭别人代码或者散播恶意程序,可能以后要分分钟暴露了。

近日,美国德雷克塞尔大学的副教授Rachel Greenstadt和乔治华盛顿大学的助理教授Aylin Caliskan发现,机器学习算法通过分析一段代码样本的风格,可以找到程序背后的作者。

就像寻找论坛匿名帖的作者一样,只要训练数据充足,自动化工具就能通过用词、句式和语法推测你是谁,即去匿名化

从貌似千篇一律的代码中找出原作者,这事背后并不简单。

编程“指纹”

机器学习算法找到一段代码作者的过程大致如下——

首先,算法识别代码样本中的所有特征。看似“千码一面”其实也蛮有特色,就像每个人说话选择的单词、组合方式、句子长度等都不同。

锁定特征后,研究人员将特征范围从数十万缩小到大约50个,只留下能真正区分出编程人员是谁的那些。

之后,研究人员不依赖“代码是如何格式化”这样的底层特性,相反,他们创建“抽象语法树”反映代码的底层结构而非任意组件。就像判断word文档是哪个人写的,你得优先查看句子结构,而不是看每个段落是否缩进了。

算法奏效前也需要喂食一些例子训练。如果一白板GitHub用户发布了一个代码片段,这个算法就不一定能够识别背后是谁。不过,也并不需要你用毕生经历来训练算法,只需几个短样本,侦探AI带回家~

9d6bafdd39b51fd346d77435c0a0aa08e0c0fe37

这不是Caliskan和Greenstadt的首个“去匿名化”的研究,去年两人发现,即使是存储库网站GitHub上的一小段代码,也足够以高精确度区分出到底是哪个程序员编写的。

论文Git Blame Who?: Stylistic Authorship Attribution of Small, Incomplete Source Code Fragments地址:

https://arxiv.org/pdf/1701.05681.pdf

Caliskan在另一篇论文中表示,只用他们编译的二进制代码就可以去匿名化。在开发人员写完一段代码后,一个名为编译器的程序能将它转换成1和0组成的编码,机器读取后即知出自谁手。

论文When Coding Style Survives Compilation:De-anonymizing Programmers from Executable Binaries地址:

https://arxiv.org/pdf/1512.08546.pdf

而这个研究还有后续,Caliskan和其他研究人员也能将二进制文件转回C++语言,同时保留程序员独特的风格。

为了进行二进制实验,Caliskan还使用了谷歌年度Code Jam比赛的代码样本。在每个人提供8个代码样本的情况下,机器学习算法识别100个程序员的准确率为96%。即使将样本量扩大到600位程序员,算法仍能达到83%的准确率。

总体来说,编程有风格,所有人都会留下“指纹”的。

越熟练,越容易暴露

这项研究要是应用到实际问题中,可以称作是编程界的包青天了。

9325e64f004ea8890a4ca77c4292d01f82e6523f

Caliskan和Greenstadt表示,这个算法不仅能判断学生的编程作业是否抄袭,还能判断开发人员是否违反了雇佣合同中的竞业条款。往大了说,还能帮政府调查恶意程序背后的始作俑者,维护网络安全。

“人们应该意识到,在这种情况下,要百分之百地隐藏自己的身份是非常困难的。”Greenstadt说。

Greenstadt发现,这个算法目前还没遇到对手,即使软件工程师使代码更复杂,也并不能成功隐藏开发人员的独特风格。

相反,有经验的开发人员比新手更容易识别。也不难理解,部分初学者经常从Stack Overflow等网站复制代码下来直接使用,反而不好分辨哪些是他们自己的风格。你越熟练,你的工作就显得越独特。

此外,越是解决棘手的问题,反而越容易暴露身份。在实验中,62名程序员每人解决了七个“简单”问题,算法去匿名化的准确率为90%。但若每人解决7个难题,算法准确率将提高到95%。

在未来,若你想隐藏自己的编程风格,还得学习更复杂的对抗方法……

未来方向

这项研究并没有到此为止,未来,Greenstadt和Caliskan想要继续探索其他因素如何影响一个人的编程风格。

比如同一组织的成员合作时编程风格的变化,不同国家的程序员编程是否有不同的方式。例如,在一项初步研究中,他们发现算法可以区分加拿大和中国开发人员编写的代码样本,准确率超过90%。

此外,面对不同编程语言是否可以用标准化的方法进行推测也是研究人员下一步的讨论的议题。

虽然目前Greenstadt和Caliskan的方法被证明有效,但他们仍然强调,去匿名化仍然是一个神秘的过程。


原文发布时间为:2018-08-14

本文作者:铜灵

本文来自云栖社区合作伙伴“量子位”,了解相关信息可以关注“量子位”。

相关文章
|
9月前
|
搜索推荐 数据库 索引
广告引擎的整体架构和工作过程
广告引擎核心是匹配用户与广告。通过用户标签、广告位信息及广告主定向条件,构建倒排索引,实现高效召回与排序,0.1秒内完成广告返回,并实时监测展现、点击与计费,确保精准投放与预算控制。
|
3月前
|
SQL 人工智能 安全
别再让 AI 温柔地夸你的烂代码了:Code Review 提示词该这样写
AI代码审查不能只求“温柔”,而要像资深工程师一样犀利。本文揭示:模糊提示=无效审查,必须用高精度角色锚点(如Google Staff Engineer)、硬性约束(P0-P3风险分级、可运行重构代码)和结构化输出,让AI真正成为生产级审查助手。提示词,已是工程规范新一环。
739 0
别再让 AI 温柔地夸你的烂代码了:Code Review 提示词该这样写
|
10月前
|
安全 算法 5G
1688平台关键字搜索商品API接口技术实践指南
本文介绍1688开放平台接口调用全流程:从授权获取token、搜索商品参数设置,到响应数据解析与HMAC-SHA1签名安全机制。涵盖分页处理公式、增量爬取策略,并提示频率限制(200次/分钟)、数据延迟及常见错误码应对,助力高效稳定接入。
|
5月前
|
人工智能 自然语言处理 安全
Open Claw 2.6.4 Windows 一键部署完整教程(技术分享)
OpenClaw(昵称“小龙虾”)是2026年热门开源AI智能体,GitHub星标超28万。支持本地运行、零代码操作、跨平台部署,可理解自然语言指令,自动完成文件管理、数据处理、浏览器自动化等任务,一键安装,隐私安全。
|
4月前
|
存储 关系型数据库 MySQL
表太大,查询慢?分区表:让亿级数据飞起来!
MySQL分区表是大表优化利器,支持Range(按时间范围)、List(按离散值)、Hash(均匀散列)三种主流分区方式,通过分区裁剪显著提升查询性能与维护效率。逻辑统一、物理拆分,适用于千万级以上数据场景,但需合理选择分区键,避免小表滥用。
|
5月前
|
人工智能 运维 API
重磅接入!GLM-5.1登陆阿里云模型广场,解锁企业AI高效落地新范式
阿里百炼上线GLM-5.1,新老用户免费领Token!模型广场直选即用,免排队抢购;支持API调用与Trae等编程工具集成;叠加节省计划享5折优惠,成本更低。性能强、长文本优、推理高效,开发者AI开发更稳、更快、更划算。
|
6月前
|
缓存 NoSQL 算法
扛住亿级流量的核心防线:限流、熔断、降级全链路深度拆解与实战
本文系统讲解分布式系统亿级流量治理,涵盖限流(固定/滑动窗口、漏桶、令牌桶及Redis分布式实现)、熔断(状态机、Resilience4j实战)与降级(功能开关、读/写降级)三大核心能力,并提供全链路分层架构、生产避坑指南与最佳实践,助力系统稳定扛压。
758 2
|
9月前
|
安全 Unix Linux
Debian安全扫描工具使用指南(手把手教你用开源工具检测Linux系统漏洞)
本文介绍多款实用的Debian安全扫描工具,帮助用户提升Linux系统安全。涵盖Lynis、OpenVAS、chkrootkit等开源工具的安装与使用,指导初学者进行漏洞检测、配置审计和恶意软件防护,并建议通过定时任务实现自动化扫描,构建多层次安全防御体系。
|
传感器 机器学习/深度学习 监控
【图像融合】差异的高斯:一种简单有效的通用图像融合方法[用于融合红外和可见光图像、多焦点图像、多模态医学图像和多曝光图像](Matlab代码实现)
【图像融合】差异的高斯:一种简单有效的通用图像融合方法[用于融合红外和可见光图像、多焦点图像、多模态医学图像和多曝光图像](Matlab代码实现)
588 0