CN116880847A - 基于开源项目的溯源方法、装置电子设备及存储介质 - Google Patents
基于开源项目的溯源方法、装置电子设备及存储介质 Download PDFInfo
- Publication number
- CN116880847A CN116880847A CN202310605868.3A CN202310605868A CN116880847A CN 116880847 A CN116880847 A CN 116880847A CN 202310605868 A CN202310605868 A CN 202310605868A CN 116880847 A CN116880847 A CN 116880847A
- Authority
- CN
- China
- Prior art keywords
- homologous
- source code
- file
- target
- determining
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F18/00—Pattern recognition
- G06F18/20—Analysing
- G06F18/22—Matching criteria, e.g. proximity measures
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Life Sciences & Earth Sciences (AREA)
- Computer Security & Cryptography (AREA)
- Artificial Intelligence (AREA)
- Bioinformatics & Cheminformatics (AREA)
- Bioinformatics & Computational Biology (AREA)
- Computer Vision & Pattern Recognition (AREA)
- Evolutionary Biology (AREA)
- Evolutionary Computation (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请提供一种基于开源项目的溯源方法、装置电子设备及存储介质,在获取到目标源代码文件后,根据指纹信息确定目标源代码文件与指纹库中的每个源代码文件之间的相似度值,并根据相似度确定同源文件,实现了文件级同源检测。根据目标源代码文件和同源文件确定同源组件和同源项目,然后,依据较文本文件命令从版本角度进一步的进行组件溯源和项目溯源,实现了组件级溯源检测和项目级同源检测,通过多角度的溯源,提供了更加精确的同源检测分析,降低了溯源分析的误判率,提高了溯源分析的效率和准确性,帮助用户更好地识别潜在的安全风险和漏洞问题,保证代码的质量和可靠性,提高了开源项目的安全性和可维护性。
Description
技术领域
本申请涉及计算机技术领域,尤其涉及一种基于开源项目的溯源方法、装置电子设备及存储介质。
背景技术
开源软件开发模式中,开发者通常会将相似或复用的代码,在多个项目中进行共享,这些共享的代码可能会存在潜在的安全风险和漏洞问题。为了解决这些问题,防止不同项目之间的代码交叉感染,需要进行开源项目溯源,找出可能存在的同源文件和组件,以进行跟踪和分析。开源项目溯源技术主要采用源码比对和代码查重的方法,一般会进行源代码文件的指纹提取,然后对指纹直接进行比对,直接进行比对会存在时间和空间复杂度高、比对效果不佳等问题。
发明内容
有鉴于此,本申请的目的在于提出一种基于开源项目的溯源方法、装置电子设备及存储介质,用于解决溯源过程中比对效果不佳的问题。
基于上述目的,本申请的第一方面提供了一种基于开源项目的溯源方法,包括:
获取目标源代码文件;
对所述目标源代码文件进行指纹提取,得到指纹信息;
根据所述指纹信息确定所述目标源代码文件与指纹库中的每个待匹配源代码文件之间的相似度值;
将所述相似度值大于预设的相似度阈值的待匹配源代码文件确定为所述目标源代码文件的同源文件;
根据所述目标源代码文件和所述同源文件确定同源组件和同源项目,得到同源项目列表和同源组件列表;
根据比较文本文件命令确定与所述同源组件不同版本的版本组件,并将所述版本组件添加至所述同源组件列表;
根据比较文本文件命令确定与所述同源项目不同版本的版本项目,并将所述版本项目添加至所述同源项目列表。
本申请的第二方面提供了一种基于开源项目的溯源装置,其特征在于,包括:
数据获取模块,被配置为:获取目标源代码文件;
指纹提取模块,被配置为:对所述目标源代码文件进行指纹提取,得到指纹信息;
相似度计算模块,被配置为:根据所述指纹信息确定所述目标源代码文件与指纹库中的每个待匹配源代码文件之间的相似度值;
文件级同源检测模块模块,被配置为:将所述相似度值大于预设的相似度阈值的待匹配源代码文件确定为所述目标源代码文件的同源文件;
组件项目级同源检测模块,被配置为:根据所述目标源代码文件和所述同源文件确定同源组件和同源项目,得到同源项目列表和同源组件列表;
对比分析模块,被配置为:根据比较文本文件命令确定与所述同源组件不同版本的版本组件,并将所述版本组件添加至所述同源组件列表;根据比较文本文件命令确定与所述同源项目不同版本的版本项目,并将所述版本项目添加至所述同源项目列表。
本申请的第三方面提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如本申请第一方面提供的所述的方法。
本申请的第四方面提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使计算机执行本申请第一方面提供的所述方法。
从上面所述可以看出,本申请提供的基于开源项目的溯源方法、装置电子设备及存储介质,在获取到目标源代码文件后,对源代码文件进行指纹提取,得到指纹信息,根据指纹信息确定目标源代码文件与指纹库中的每个源代码文件之间的相似度值,将相似度值大于预设的相似度阈值的源代码文件确定为目标源代码文件的同源文件,通过对之指纹信息计算文件之间的相似值,筛选出相似度值符合要求的文件作为同源文件,实现了文件级同源检测。根据目标源代码文件和同源文件确定同源组件和同源项目,得到同源项目列表和同源组件列表,然后,依据较文本文件命令从版本角度进一步的进行组件溯源和项目溯源,实现了组件级溯源检测和项目级同源检测,通过多角度的溯源,提供了更加精确的同源检测分析,降低了溯源分析的误判率,提高了溯源分析的效率和准确性,帮助用户更好地识别潜在的安全风险和漏洞问题,保证代码的质量和可靠性,提高了开源项目的安全性和可维护性。
附图说明
为了更清楚地说明本申请或相关技术中的技术方案,下面将对实施例或相关技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例基于开源项目的溯源方法的流程图;
图2为本申请实施例确定指纹信息的流程图;
图3为本申请实施例确定相似度值的流程图;
图4为本申请实施例确定同源组件的流程图;
图5为本申请实施例确定同源项目的流程图;
图6为本申请实施例基于开源项目的溯源装置的结构示意图;
图7为本申请实施例电子设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本申请进一步详细说明。
需要说明的是,除非另外定义,本申请实施例使用的技术术语或者科学术语应当为本申请所属领域内具有一般技能的人士所理解的通常意义。本申请实施例中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
在本文中,需要理解的是,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。
在一些实施例中,如图1所示,一种基于开源项目的溯源方法,包括:
步骤101:获取目标源代码文件。
具体实施时,目标源代码文件可以为用户上传的任意任意一个需要进行同源检测分析的源代码文件,源代码文件是由源代码构成的文本文件,源代码是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列可读的计算机语言指令。在现代程序语言中,源代码最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,通过编译器完成。
步骤102:对目标源代码文件进行指纹提取,得到指纹信息。
具体实施时,通过代码变换将目标源代码文件转换为中间表示文件,然后将中间表示文件的源代码中的标识符、操作符、语句转换为一些离散的token(文本令牌),进而将token转换为固定长度的令牌向量,整合全部的令牌向量,得到令牌列表,并将令牌列表确定为指纹信息。
其中,对于源代码文件来说,在确定该源代码文件的身份时,不可能去一一检测源代码文件的每个字节,也不能简单地利用文件名、文件大小这些极容易伪装的信息作为识别其身份的信息,所以就需要一种指纹一样的标志来检查源代码文件的可靠性,这种指纹就是通过哈希算法得到的,哈希算法是一种从任意文件中创造小的数字指纹的方法。哈希算法的目的就是以一种较短的信息来保证源代码文件具有唯一性的标志,这种唯一性的标志就是源代码文件的指纹信息,指纹信息与源代码文件的每一个字节都相关,而且难以找到逆向规律。因此,当源代码文件发生改变时,其指纹信息也会发生改变,从而告知文件使用者当前的源代码文件已经不是最初所需求的目标源代码文件。所以使用指纹信息可以保证溯源过程中目标源代码文件不被更改,从溯源需求角度保证溯源的准确性。
步骤103:根据指纹信息确定目标源代码文件与指纹库中的每个待匹配源代码文件之间的相似度值。
具体实施时,将目标源代码文件和任意一个待匹配源代码文件分词之后,通过局部敏感哈希(Locality Sensitive Hashing,LSH)算法分别确定目标源代码文件的第一局部敏感哈希值和待匹配源代码文件的第二局部敏感哈希值,然后,根据第一局部敏感哈希值和第二局部敏感哈希值,对目标源代码文件和待匹配源代码文件进行相似计算,得到相似度值。
步骤104:将相似度值大于预设的相似度阈值的待匹配源代码文件确定为目标源代码文件的同源文件。
具体实施时,根据计算得到的相似度值对待匹配源代码文件进行筛选,只有相似度值大于预设的相似度阈值的待匹配源代码文件才可以作为目标源代码文件的同源文件,进一步对待匹配源代码文件进行筛选,提供了更加精确的同源检测分析,降低了溯源分析的误判率,提高了溯源分析的效率和准确性。
步骤105:根据目标源代码文件和同源文件确定同源组件和同源项目,得到同源项目列表和同源组件列表。
具体实施时,对于同源项目列表的获取,主要是通过对开源项目的代码库进行分析,提取各个项目的特征形成相应的项目特征向量,再通过余弦相似度计算对项目之间的相似度进行比对,从而找到可能存在的同源项目。
具体实现方法如下:
1)对于每个目标项目,将该目标项目中的所有文件通过文件级同源检测,标记出该目标项目中的同源文件,得到初始同源文件列表。
2)对于该项目的初始同源文件列表中的同源文件,通过文件级同源检测,找出这些同源文件可能存在的子同源文件,整合子同源文件和同源文件,得到通源文件列表。
3)将同源文件列表中的文件进行特征提取,将提取出的特征形成相应的项目特征向量。
4)通过余弦相似度计算算法,将不同项目的项目特征向量进行比对,找出可能存在的同源项目。
对于同源项目列表的获取,主要是通过对已知的开源组件的代码库进行分析,提取各个组件的特征形成相应的组件特征向量,然后使用余弦相似度计算对组件之间的相似度进行比对,找到可能存在的同源组件。
具体实现方法如下:
1)对于每个目标组件,通过文件级同源检测找出可能存在的同源文件,然后对同源文件进行组件提取,得到该目标组件的目标组件代码。
2)将目标组件代码中所有的函数分离出来,作为目标组件的组件特征向量。
3)通过余弦相似度计算算法,将不同组件的组件特征向量进行比对,找出可能存在的同源组件。
步骤106:根据比较文本文件命令确定与同源组件不同版本的版本组件,并将版本组件添加至同源组件列表。
具体实施时,通过比较文本文件命令DIFF对同一组件的不同版本间进行DIFF比对,确定与同源组件不同版本的版本组件,并将版本组件添加至同源组件列表,通过识别代码在版本间的变更,区分不同版本的组件之间源代码的变化情况,标记版本间的新增部分、删除部分、修改部分,更好地帮助用户理解源代码之间的关系。
步骤107:根据比较文本文件命令确定与同源项目不同版本的版本项目,并将版本项目添加至同源项目列表。
具体实施时,通过比较文本文件命令DIFF对同一项目的不同版本间进行DIFF比对,确定与同源项目不同版本的版本项目,并将版本项目添加至同源项目列表,通过识别代码在版本间的变更,区分不同版本的项目之间源代码的变化情况,标记版本间的新增部分、删除部分、修改部分,更好地帮助用户理解源代码之间的关系。
综上所述,本申请提供的基于开源项目的溯源方法,在获取到目标源代码文件后,对源代码文件进行指纹提取,得到指纹信息,根据指纹信息确定目标源代码文件与指纹库中的每个源代码文件之间的相似度值,将相似度值大于预设的相似度阈值的源代码文件确定为目标源代码文件的同源文件,通过对之指纹信息计算文件之间的相似值,筛选出相似度值符合要求的文件作为同源文件,实现了文件级同源检测。根据目标源代码文件和同源文件确定同源组件和同源项目,得到同源项目列表和同源组件列表,然后,依据较文本文件命令从版本角度进一步的进行组件溯源和项目溯源,实现了组件级溯源检测和项目级同源检测,通过多角度的溯源,提供了更加精确的同源检测分析,降低了溯源分析的误判率,提高了溯源分析的效率和准确性,帮助用户更好地识别潜在的安全风险和漏洞问题,保证代码的质量和可靠性,提高了开源项目的安全性和可维护性。
在一些实施例中,如图2所示,对源代码文件进行指纹提取,得到指纹信息,包括:
步骤201:通过代码变换将目标源代码文件转换为中间表示文件。
具体实施时,采用语言无关的代码变换技术,将源代码文件转换为中间表示形式(Intermediate Representation,IR)。语言无关的代码变换技术是基于抽象语法树(abstract syntax tree,AST)进行的。对于目标源代码文件,可以通过构建AST来实现语法解析,示例性的,可以利用ANTLR或Java Parser等工具将源代码解析为AST。然后,去除AST中所有与语言文法无关的元素,例如注释、空格、换行符等,最终得到一个与语言相关的表示形式,完成将AST变为中间表示形式的转换。通过转换为中间表示形式可以保证同一份源代码编写的同源文件无论用何种编程语言编写,生成的中间表示形式都是相同的,有利于提高溯源分析的效率和准确性。
步骤202:对中间表示文件进行分词,将得到的令牌列表确定为指纹信息。
具体实施时,在中间表示文件上执行tokenization以及vectorization操作,将目标源代码文件中的标识符、操作符、语句转换为一些离散的令牌token,进而将token转换为固定长度的令牌向量,整合这些令牌向量,得到令牌列表,并将令牌列表确定为目标源代码文件指纹信息。在Java中,我们可以使用ANTLR或Java Parser等工具来实现这个过程。
在一些实施例中,步骤201包括:
步骤2011:通过语法解析器对目标源代码文件进行语法解析,得到抽象语法树。
具体实施时,可以通过使用JavaParser解析目标源代码文件,获取抽象语法树,其中,抽象语法树是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,这种表示是抽象的,因为抽象语法树并不会表示出真实语法出现的每一个细节,示例性的,嵌套括号被隐含在树的结构中,并没有以节点的形式呈现。
步骤2012:通过代码变换删除抽象语法树中的目标元素,得到中间表示文件;其中,目标元素为抽象语法树中与语言文法无关的元素。
具体实施时,目标元素为抽象语法树中所有与语言文法无关的元素,例如注释、空格、换行符等,将抽象语法树中的目标元素删除后,完成将AST变为中间表示形式的转换,最终得到一个与语言相关的中间表示文件。通过转换为中间表示形式可以保证同一份源代码编写的同源文件无论用何种编程语言编写,生成的中间表示形式都是相同的,有利于提高溯源分析的效率和准确性。
在一些实施例中,步骤202包括:
步骤2022:对中间表示文件进行分词,得到多个文本令牌。
具体实施时,在中间表示文件上进行tokenization操作可以将目标源代码文件中的标识符、操作符、语句等转换为相应文本令牌。
步骤2023:根据预设的向量长度对文本令牌进行向量转换,得到多个令牌向量。
具体实施时,预设的向量长度可以用字符的个数表示,示例性的,以“文本令牌”和“token”为例,如果向量长度为1,则“文本令牌”在分词后为“[文,本,令,牌]”,“token”在分词后为“[t,o,k,e,n]”;如果向量长度为2,则“文本令牌”在分词后为[文本,本令,令牌],“token”在分词后为“[to,ok,ke,en]”分词后更加容易比对目标源代码文件与待匹配源代码文件之间的的相似度。示例性的,以“which”和“watch”为例,向量长度为1时,分词后分别为[w,h,i,c,h]和[w,a,t,c,h],有60%的重复度,相似度较高,当向量长度为2时,分词后分别为[wh,hi,ic,ch]和[wa,at,tc,ch],有25%的重复度,相似度较低,说明在相似度相同的情况下,向量长度越长准确率越高,由于预设的向量长度不同,对于相似度的影响较大,所以需要根据据实际情况进行向量长度的设置,且进行相似度计算时并不会以明文的形式直接进行比对,所以在此不做具体限定。
步骤2024:整合多个令牌向量,得到令牌列表,并将令牌列表确定为指纹信息。
具体实施时,目标源代码文件的字符数较多,所以得到分词后得到的令牌也较多,所以需要对多个令牌向量进行整合,得到令牌列表,并将令牌列表确定为指纹信息。
在一些实施例中,如图3所示,根据指纹信息确定目标源代码文件与指纹库中的每个源代码文件之间的相似度值,包括:
步骤301:根据指纹信息确定目标源代码文件的第一局部敏感哈希值。
具体实施时,可以采用局部敏感哈希算法将目标源代码文件的指纹信息中的令牌向量映射为第一局部敏感哈希值。其中,LSH算法可以将高维向量映射到低维空间,并将相似的向量映射到相邻区域,大大降低了计算相似度所需的计算量。
其中,在映射过程中,对于预先构建的向量空间,将其划分为多个超立方体桶,对于每个令牌向量,使用随机哈希函数对其进行哈希,并将哈希值映射到对应超立方体桶中。其中,向量空间可以理解为一个n维的空间,根据目标源代码文件的信息或者目标源代码文件文件的片段信息,会出现多个向量空间,一个向量空间对应多个超级立方桶,具体数量与目标源代码文件的数量规模相关,在此不做具体限定。每个超立方体桶对应至少一种特征信息,如果目标源代码文件中存在与该超立方体桶对应的特征信息,就对将对应的第一局部敏感哈希值应映射到这个超立方体桶中。根据目标源代码文件信息的载体量,每个目标源代码文件对应多个第一局部敏感哈希值,相应的,超立方体桶的对应的第一局部敏感哈希值会涉及至少一个源代码文件,所以,对于每个超立方体桶,保留其中的至少一个第一局部敏感哈希值,并将至少一个第一局部敏感哈希值作为超立方体的LSH特征值,用于参与映射。
步骤302:在指纹库中选取待匹配源代码文件。
具体实施时,在单线程的情况下,可以依次不重复的在指纹库中选取待匹配源代码文件,依次与目标源代码文件进行相似度的比较。在多线程的情况下,可以在指纹库中选取多个待匹配源代码文件同时与目标源代码文件进行相似度的比较。
步骤303:确定待匹配源代码文件的第二局部敏感哈希值。
具体实施时,可以采用局部敏感哈希算法将待匹配源代码文件的指纹信息中的令牌向量映射为第二局部敏感哈希值。
步骤304:根据第一局部敏感哈希值和第二局部敏感哈希值,对目标源代码文件和待匹配源代码文件进行局部敏感哈希匹配,得到相似度值。
具体实施时,可以创建了一个LSHMinHash类来实现局部敏感哈希匹配。预先设定m和b来表示使用的哈希函数数量和超立方体桶的桶数量。随机生成m个哈希函数,用于将向量映射到不同的b个桶中。在每个超立方体桶中保存至少一个哈希值,以增加每个超立方体桶的覆盖范围。分别计算两个实例的每个桶的Jaccard similarity,并计算最终的相似度。示例性的,已知有超立方体桶A,B,每个超立方体桶都含有n个二元的属性,n为一个超立方体桶对应的源代码文件的数量,二元的属性表示每个属性都是0或1,M11表示A和B对应位都是1的属性的数量,M10表示A中为1,B中对应位为0的总数量,M01表示A中为0,B中对应位为1的总数量,M00表示对应位都为0的总数量,M11+M10+M01+M00=n,则Jaccard相似度为J
将相似度大于给定的相似度阈值的待匹配源代码文件确定目标源代码文件为的同源文件。
在一些实施例中,如图4所示,根据所述目标源代码文件和所述同源文件确定同源组件,包括:
步骤401:确定目标源代码文件所在的目标组件。
具体实施时,对于同源项目列表的获取,主要是通过对已知的开源组件的代码库进行分析,提取各个组件的特征形成相应的组件特征向量,然后使用余弦相似度计算对组件之间的相似度进行比对,找到可能存在的同源组件。所以首先需要确定目标源代码文件所在的目标组件,将该目标组件作为比对的基准来寻找同源组件,进而组成同源组件列表。
步骤402:根据同源文件进行组件代码提取,得到目标组件的目标组件代码。
具体实施时,对于每个目标组件,通过文件级同源检测找出可能存在的同源文件,然后对同源文件进行组件提取,得到该目标组件的目标组件代码。
步骤403:对目标组件代码进行特征提取,得到目标组件特征向量。
具体实施时,将目标组件代码中所有的函数分离出来,作为目标组件的组件特征向量。
步骤404:基于目标组件特征向量,在全部组件中根据余弦相似度计算算法确定目标组件的同源组件。
具体实施时,通过余弦相似度计算算法,将不同组件的组件特征向量与目标组件特征向量进行比对,进而在全部组件中找出可能存在的同源组件。
在一些实施例中,如图5所示,根据目标源代码文件和同源文件确定同源项目,包括:
步骤501:确定目标源代码文件所在的目标项目。
具体实施时,对于同源项目列表的获取,主要是通过对开源项目的代码库进行分析,提取各个项目的特征形成相应的项目特征向量,再通过余弦相似度计算对项目之间的相似度进行比对,从而找到可能存在的同源项目。所以首先需要确定目标源代码文件所在的目标项目,将该目标项目作为比对的基准来寻找同源项目,进而组成同源项目列表。
步骤502:确定每个同源文件的子同源文件,并整合全部的同源文件和子同源文件,得到同源文件列表。
具体实施时,对于每个目标项目,将该目标项目中的所有文件通过文件级同源检测,标记出该目标项目中的同源文件,得到初始同源文件列表。对于该项目的初始同源文件列表中的同源文件,通过文件级同源检测,找出这些同源文件可能存在的子同源文件,整合子同源文件和同源文件,得到通源文件列表。
步骤503:对同源文件列表进行特征提取,得到目标项目特征向量。
具体实施时,将同源文件列表中的文件进行特征提取,将提取出的特征形成相应的目标项目特征向量。
步骤504:基于目标项目特征向量,在全部项目中根据余弦相似度计算算法确定目标项目的同源项目。
具体实施时,通过余弦相似度计算算法,将不同项目的项目特征向量进行与目标项目特征向量比对,找出可能存在的同源项目,进而在全部项目中找出可能存在的同源项目。
需要说明的是,本申请实施例的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本申请实施例的方法中的某一个或多个步骤,这多台设备相互之间会进行交互以完成所述的方法。
需要说明的是,上述对本申请的一些实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于上述实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
基于同一发明构思,与上述任意实施例方法相对应的,本申请还提供了一种基于开源项目的溯源装置装置。
参考图6,一种基于开源项目的溯源装置,包括:
数据获取模块10,被配置为:获取目标源代码文件;
指纹提取模块20,被配置为:对目标源代码文件进行指纹提取,得到指纹信息;
相似度计算模块30,被配置为:根据指纹信息确定目标源代码文件与指纹库中的每个待匹配源代码文件之间的相似度值;
文件级同源检测模块模块40,被配置为:将相似度值大于预设的相似度阈值的待匹配源代码文件确定为目标源代码文件的同源文件;
组件项目级同源检测模块50,被配置为:根据目标源代码文件和同源文件确定同源组件和同源项目,得到同源项目列表和同源组件列表;
对比分析模块60,被配置为:根据比较文本文件命令确定与同源组件不同版本的版本组件,并将版本组件添加至同源组件列表;根据比较文本文件命令确定与同源项目不同版本的版本项目,并将版本项目添加至同源项目列表。
为了描述的方便,描述以上装置时以功能分为各种模块分别描述。当然,在实施本申请时可以把各模块的功能在同一个或多个软件和/或硬件中实现。
上述实施例的装置用于实现前述任一实施例中相应的基于开源项目的溯源方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
基于同一发明构思,与上述任意实施例方法相对应的,本申请还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上任意一实施例所述的基于开源项目的溯源方法。
图7示出了本实施例所提供的一种更为具体的电子设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。
处理器1010可以采用通用的CPU(Central Processing Unit,中央处理器)、微处理器、应用专用集成电路(Application Specific Integrated Circuit,ASIC)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
存储器1020可以采用ROM(Read Only Memory,只读存储器)、RAM(Random AccessMemory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。
输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如USB、网线等)实现通信,也可以通过无线方式(例如移动网络、WIFI、蓝牙等)实现通信。
总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。
需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
上述实施例的电子设备用于实现前述任一实施例中相应的基于开源项目的溯源方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
基于同一发明构思,与上述任意实施例方法相对应的,本申请还提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行如上任一实施例所述的基于开源项目的溯源方法。
本实施例的计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
上述实施例的存储介质存储的计算机指令用于使所述计算机执行如上任一实施例所述的基于开源项目的溯源方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本申请的范围(包括权利要求)被限于这些例子;在本申请的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本申请实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。
另外,为简化说明和讨论,并且为了不会使本申请实施例难以理解,在所提供的附图中可以示出或可以不示出与集成电路(IC)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本申请实施例难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本申请实施例的平台的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本申请的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本申请实施例。因此,这些描述应被认为是说明性的而不是限制性的。
尽管已经结合了本申请的具体实施例对本申请进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态RAM(DRAM))可以使用所讨论的实施例。
本申请实施例旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本申请实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (10)
1.一种基于开源项目的溯源方法,其特征在于,包括:
获取目标源代码文件;
对所述目标源代码文件进行指纹提取,得到指纹信息;
根据所述指纹信息确定所述目标源代码文件与指纹库中的每个待匹配源代码文件之间的相似度值;
将所述相似度值大于预设的相似度阈值的待匹配源代码文件确定为所述目标源代码文件的同源文件;
根据所述目标源代码文件和所述同源文件确定同源组件和同源项目,得到同源项目列表和同源组件列表;
根据比较文本文件命令确定与所述同源组件不同版本的版本组件,并将所述版本组件添加至所述同源组件列表;
根据比较文本文件命令确定与所述同源项目不同版本的版本项目,并将所述版本项目添加至所述同源项目列表。
2.根据权利要求1所述的方法,其特征在于,所述对所述源代码文件进行指纹提取,得到指纹信息,包括:
通过代码变换将所述目标源代码文件转换为中间表示文件;
对所述中间表示文件进行分词,将得到的令牌列表确定为所述指纹信息。
3.根据权利要求2所述的方法,其特征在于,所述通过代码变换将所述目标源代码文件转换为中间表示文件,包括:
通过语法解析器对所述目标源代码文件进行语法解析,得到抽象语法树;
通过代码变换删除所述抽象语法树中的目标元素,得到所述中间表示文件;
其中,所述目标元素为所述抽象语法树中与语言文法无关的元素。
4.根据权利要求2所述的方法,其特征在于,所述对所述中间表示文件进行分词,将得到的令牌列表确定为所述指纹信息,包括:
对所述中间表示文件进行分词,得到多个所述文本令牌;
根据预设的向量长度对所述文本令牌进行向量转换,得到多个令牌向量;
整合多个所述令牌向量,得到所述令牌列表,并将所述令牌列表确定为所述指纹信息。
5.根据权利要求1所述的方法,其特征在于,所述根据所述指纹信息确定所述目标源代码文件与指纹库中的每个待匹配源代码文件之间的相似度值,包括:
根据所述指纹信息确定所述目标源代码文件的第一局部敏感哈希值;
在所述指纹库中选取所述待匹配源代码文件;
确定所述待匹配源代码文件的第二局部敏感哈希值;
根据所述第一局部敏感哈希值和所述第二局部敏感哈希值,对所述目标源代码文件和所述待匹配源代码文件进行相似度计算,得到所述相似度值。
6.根据权利要求1所述的方法,其特征在于,根据所述目标源代码文件和所述同源文件确定同源组件,包括:
确定所述目标源代码文件所在的目标组件;
根据所述同源文件进行组件代码提取,得到所述目标组件的目标组件代码;
对所述目标组件代码进行特征提取,得到目标组件特征向量;
基于所述目标组件特征向量,在全部组件中根据所述余弦相似度计算算法确定所述目标组件的同源组件。
7.根据权利要求1所述的方法,其特征在于,根据所述目标源代码文件和所述同源文件确定同源项目,包括:
确定所述目标源代码文件所在的目标项目;
确定每个所述同源文件的子同源文件,并整合全部的所述同源文件和所述子同源文件,得到同源文件列表;
对所述同源文件列表进行特征提取,得到目标项目特征向量;
基于所述目标项目特征向量,在全部项目中根据所述余弦相似度计算算法确定所述目标项目的同源项目。
8.一种基于开源项目的溯源装置,其特征在于,包括:
数据获取模块,被配置为:获取目标源代码文件;
指纹提取模块,被配置为:对所述目标源代码文件进行指纹提取,得到指纹信息;
相似度计算模块,被配置为:根据所述指纹信息确定所述目标源代码文件与指纹库中的每个待匹配源代码文件之间的相似度值;
文件级同源检测模块模块,被配置为:将所述相似度值大于预设的相似度阈值的待匹配源代码文件确定为所述目标源代码文件的同源文件;
组件项目级同源检测模块,被配置为:根据所述目标源代码文件和所述同源文件确定同源组件和同源项目,得到同源项目列表和同源组件列表;
对比分析模块,被配置为:根据比较文本文件命令确定与所述同源组件不同版本的版本组件,并将所述版本组件添加至所述同源组件列表;根据比较文本文件命令确定与所述同源项目不同版本的版本项目,并将所述版本项目添加至所述同源项目列表。
9.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如权利要求1至7任意一项所述的方法。
10.一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使计算机执行权利要求1至7任一所述方法。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202310605868.3A CN116880847A (zh) | 2023-05-25 | 2023-05-25 | 基于开源项目的溯源方法、装置电子设备及存储介质 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202310605868.3A CN116880847A (zh) | 2023-05-25 | 2023-05-25 | 基于开源项目的溯源方法、装置电子设备及存储介质 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| CN116880847A true CN116880847A (zh) | 2023-10-13 |
Family
ID=88259330
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN202310605868.3A Pending CN116880847A (zh) | 2023-05-25 | 2023-05-25 | 基于开源项目的溯源方法、装置电子设备及存储介质 |
Country Status (1)
| Country | Link |
|---|---|
| CN (1) | CN116880847A (zh) |
Cited By (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN118171250A (zh) * | 2024-03-20 | 2024-06-11 | 山东省医疗器械和药品包装检验研究院 | 一种代码指纹溯源识别方法、系统、终端及存储介质 |
| CN118227684A (zh) * | 2024-05-23 | 2024-06-21 | 中国电子科技集团公司第三十研究所 | 一种基于多维离散数据指纹的数据行为追溯方法 |
| CN119180034A (zh) * | 2024-07-23 | 2024-12-24 | 北京宏达隆和科技有限公司 | 一种开源组件血缘分析方法及系统 |
| CN119377086A (zh) * | 2024-12-30 | 2025-01-28 | 北京安普诺信息技术有限公司 | 基于sca的代码同源检测方法、装置、计算机设备及介质 |
-
2023
- 2023-05-25 CN CN202310605868.3A patent/CN116880847A/zh active Pending
Cited By (5)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN118171250A (zh) * | 2024-03-20 | 2024-06-11 | 山东省医疗器械和药品包装检验研究院 | 一种代码指纹溯源识别方法、系统、终端及存储介质 |
| CN118227684A (zh) * | 2024-05-23 | 2024-06-21 | 中国电子科技集团公司第三十研究所 | 一种基于多维离散数据指纹的数据行为追溯方法 |
| CN119180034A (zh) * | 2024-07-23 | 2024-12-24 | 北京宏达隆和科技有限公司 | 一种开源组件血缘分析方法及系统 |
| CN119180034B (zh) * | 2024-07-23 | 2025-10-17 | 北京宏达隆和科技有限公司 | 一种开源组件血缘分析方法及系统 |
| CN119377086A (zh) * | 2024-12-30 | 2025-01-28 | 北京安普诺信息技术有限公司 | 基于sca的代码同源检测方法、装置、计算机设备及介质 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| David et al. | Neural reverse engineering of stripped binaries using augmented control flow graphs | |
| CN116880847A (zh) | 基于开源项目的溯源方法、装置电子设备及存储介质 | |
| CN111708539A (zh) | 一种应用程序代码转换方法、装置、电子设备和存储介质 | |
| US10353702B2 (en) | Source code element signatures | |
| WO2021017735A1 (zh) | 一种智能合约的形式化验证方法、电子装置及存储介质 | |
| US20060005166A1 (en) | Method, system and program product for determining java software code plagiarism and infringement | |
| KR102006245B1 (ko) | 바이너리 파일에 기초하여 오픈소스 소프트웨어 패키지를 식별하는 방법 및 시스템 | |
| US8931092B2 (en) | System and method for computer inspection of information objects for shared malware components | |
| US20200380125A1 (en) | Method for Detecting Libraries in Program Binaries | |
| CN106295346B (zh) | 一种应用漏洞检测方法、装置及计算设备 | |
| US9207915B2 (en) | Methods for detecting plagiarism in software code implementing a design pattern, including detecting a design pattern implemented in the software code and creating a representation that implements program logic associated with at least one function implementing the design pattern | |
| CN117113347A (zh) | 一种大规模代码数据特征提取方法及系统 | |
| CN112733158A (zh) | Android系统漏洞检测方法、电子设备及存储介质 | |
| KR102462541B1 (ko) | 오픈소스 소프트웨어의 라이선스를 검증하는 방법 및 시스템 | |
| CN110750297B (zh) | 一种基于程序分析和文本分析的Python代码参考信息生成方法 | |
| CN112632423B (zh) | Url提取方法及装置 | |
| CN114579969A (zh) | 漏洞检测方法、装置、电子设备及存储介质 | |
| CN109446078A (zh) | 代码测试方法及装置、存储介质、电子设备 | |
| KR20190080445A (ko) | 악성코드 검출을 위한 화이트리스트 구축 방법 및 이를 수행하기 위한 기록매체 및 장치 | |
| US9575750B2 (en) | Generic annotation seeker | |
| CN112379915B (zh) | 一种源代码处理方法及装置 | |
| CN119150302B (zh) | 一种基于大语言模型的软件安全漏洞智能挖掘方法及系统 | |
| CN114579977A (zh) | 一种用于嵌入式操作系统的代码漏洞检测方法 | |
| CN110162309B (zh) | 参数校验方法及装置 | |
| CN115659344B (zh) | 一种软件供应链检测方法及装置 |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| PB01 | Publication | ||
| PB01 | Publication | ||
| SE01 | Entry into force of request for substantive examination | ||
| SE01 | Entry into force of request for substantive examination |