赛题介绍:
实现一个Linux下的二进制签名和验证程序,用于在国产Linux操作系统进行应用的标识和管理,提升应用程序的可追溯性和安全性鉴别能力。
场景:
流程要求开发者需对自己开发的应用进行签名,以保证二进制的安全性(非篡改),因此需要一款可以对二进制进行签名和验证的程序。
需求分析:
对于Linux下给定的ELF可执行程序、自行开发签名工具对程序的代码段(Load Segment)首先进行散列,然后对散列值进行签名,签名数据应作为单独的节(Section)附加到原ELF可执行程序的尾部。同时,应开发验证软件并加入操作系统,在运行任何ELF可执行程序前对ELF文件进行验证,若ELF可执行程序没有被签名或者签名验证失败则应停止运行本程序,若签名验证成功则可以正常运行。
签名后的ELF可执行程序可正常运行在带有签名验证的Linux操作系统上,以及不带有签名验证机制的Linux操作系统上;
签名后的ELF可执行程序中的签名数据节应可通过readelf与objdump等程序解析得到正确的值;
运行ELF可执行程序的方式应保持不变,不得通过其他程序运行ELF可执行程序的方式验证签名;
签名验证所需要的公钥、证书以及验证程序可以预先设置在操作系统中;
本题不考察选手对加密算法的实现,因此选手可以选择开源的加密软件库进行加密,但是对应强度应不低于RSA2048;
实现程序主要涉及对ELF可执行格式的理解、Linux操作系统下程序运行的机制的理解,以及对加密算法的运用。
原型设计:
①完成基于公私玥的签名程序,能对任意ELF程序进行签名,并能通过readelf等程序读取添加的节,且不影响程序的正常运行。
②完成基于公私玥的验证程序,能透明地对任意ELF程序在运行前进行签名验证。
③签名验证通过的可以正常运行,未通过的不允许运行,对比未实施签名验证前的程序启动时间延迟不超过10%。
知识储备:
ELF可执行文件:
ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(object files)中都放了什么东西、以及都以什么样的格式去放这些东西。
目标文件在不同的系统或平台上具有不同的命名格式,在Unix和X86-64 Linux上称为ELF(Executable and Linkable Format)。
ELF文件格式提供了两种不同的视角,在汇编器和链接器看来,ELF文件是由Section Header Table描述的一系列Section的集合,而执行一个ELF文件时,在加载器(Loader)看来它是由Program Header Table描述的一系列Segment的集合。
.text就是其代码段。
散列:
哈希表是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与表格和队列等相比,哈希表无疑是查找速度比较快的一种。
通过将单向数学函数(有时称为“哈希算法”)应用到任意数量的数据所得到的固定大小的结果。如果输入数据中有变化,则哈希也会发生变化。哈希可用于许多操作,包括身份验证和数字签名。也称为“消息摘要”。
对消息的散列值进行签名:
我们可以不必对整个消息进行加密(即对消息签名),而是先用单向散列函数求出消息的散列值,然后在将散列值进行加密(对散列值签名)就可以了。无论消息有多长,散列值永远都是这么短,因此对其进行加密(签名)就非常轻松了。
博客资料: