随着数字时代的发展,每天都有海量的数据产生,并且用户也越来越重视个人隐私数据的安全,从某种意义上讲,用户个人数据的价值正逐步高于设备本身。实现数据安全保护的基础是【密钥 + 加密算法】;对于加密算法,kernel其实早在linux-2.5.45版本中就引入了crypto基础能力。本篇文章主要讲关于kernel crypto算法框架,以及结合它在文件系统加密这一场景中的应用,分析内部的实现细节,以便读者对crypto框架有相关的认识,并能基于它做开发。
本篇文章的所有代码都是围绕Linux-4.19,以OOP思想进行阐述,大家可以结合源码进行阅读。
为方便理解,我们约定一些术语:
1.功能
Kernel crypto是内核实现的一套通用crypto算法框架,是一个独立的子系统,源码在kernel/crypto下,它实现了对算法的统一管理,并提供出统一的数据处理接口给其他子系统使用;因此基于这套框架,我们不仅可以使用kernel已有的crypto算法对数据做转换,还能自行扩展添加算法。
Kernel crypto 当前实现了对称加解密,非对称加解密,认证加解密,hash,Hmac,DRBG伪随机数生成算法和压缩算法。
2.适用场景
Kernel crypto主要用于kernel层的安全特性实现,但在user-space也可以通过系统调用的方式来使用它;因为在Linux-2.6.38中已经通过socket (addr family: AF_ALG)方式导出接口到user-space.
在开发时如要快速确认kernel中是否支持某种算法,可以cat /proc/crypto 查看,如下图1.1。
图1.1 kernel支持的加密算法
name代表算法名称,hmac是对应的模式(抽象成template);priority代表算法的优先级(在相同名称下,数字越大代表优先级越高,默认使用高优先级的算法);selftest代表开机算法自检结果;type指算法类型;async指异步方式调用;blocksize指最小单个数据处理块大小;min keysize和max keysize指算法的最小/最大密钥长度;ivsize指算法的IV初始向量长度。
*selftest之后的所有字段其实都是crypto_type->show()所提供的,后面会提及。
3.整体架构
下面通过一张图来展示crypto的整体框架。
图1.2 kernel crypto框架
crypto core是最基本骨架 ,它提供crypto的核心组件(包括crypto_alg,crypto_template的管理,cryptd内核线程等);基于crypto core,内核实现了8类常用的算法,DRBG伪随机数算法,Hash算法,SKCIPHER对称加解密算法,AKCIPHER非对称加解密算法,AEAD认证加密算法,HMAC算法,COMPRESS压缩算法,KPP密钥协商算法。
一些用于secure的硬件模块(如hw_rng硬件随机数产生器,qce硬加密模块)的驱动程序,会通过crypto core提供的算法注册接口(crypto_register_alg)将其注册到crypto子系统中,并且在注册时会对算法做静态正确性自检,并在/proc/crypto中的selftest中呈现到userspace。除了注册到crypto子系统以外,驱动也可以通过VFS以设置节点形式提供给用户空间使用(如/dev/qce,/dev/hw_rng)。
Crypto core通过socket方式,将kernel层的算法能力提供给用户空间。
算法本质上就是一些对数据进行逻辑处理的函数,在应用层的实现普遍是直接实现一个加解密接口,应用程序直接调用,对使用者来说极为方便。但在kernel中,使用起来会较为复杂些,因为它需要考虑到算法的易扩展性,通用性,易维护性等,因此对算法做了高度的抽象化;所以要理解kernel crypto的设计思想,必须要理解它的几个核心struct。
1.核心数据结构
在软件界有句话写的很实在:”软件=文件+程序,程序=数据结构+算法”;由此能看出弄清数据结构的重要性。
Kernel crypto中基本所有操作都是围绕着几个核心数据结构展开:struct crypto_alg,struct crypto_template,struct crypto_instance,struct crypto_tfm,struct crypto_type。其他算法都可以基于它们做扩展。例如struct skcipher_alg,struct shash_alg都是继承自struct crypto_alg,见下图2.1:
图2.1 crypto数据结构uml类图
下面对这6个结构体做相关说明:
1)struct crypto_template
算法模板,一般在module_init时通过调用crypto_register_template接口注册到crypto_template_list链表中。
在算法加密中,分块加密模式分为很多种,以对称加解密为例,有CBC,ECB,GCM,CTR,XTS,而这些加密模式适用于所有的对称加密算法,如AES,DES;因此kernel就将加密模式抽象成模板,在开发新的算法时只需要实现单个block的数据处理(加密,hmac等);在申请使用算法时,我们通过算法名来组合出相应的算法(kernel会将组合出来的算法动态注册到crypto子系统),格式为template(single block cipher),例如cbc(aes),ecb(des)。
2)struct crypto_alg
crypto_alg是个基类,任何算法都可以基于它派生出衍生类;每个算法都对应着一个struct crypto_alg实例,一般在module_init中调用crypto_register_alg接口将具体的crypto_alg对象添加到crypto_alg_list链表中。这里有一个很重要的数据成员cra_u,因为它体现了kernel crypto架构设计者的设计思想:它将四种比较常用的算法类型的处理方式抽象到基类当中,即如果你要添加的算法为这4类,就只需要实现这4类算法所对应的方法,如果不是这4类当中,就需要在基类上做派生,实现特定的crypto_type。
3)struct crypto_instance
这个结构体是代表kernel通过template动态创建的算法实例,并且会与crypto_template相关联,可以看到这里的alg并不是个指针。它是通过template->alloc()创建的,创建的同时,会将算法name初始化。
4)struct crypto_spawn
通过模板动态生成的算法实例的一部分。
5)struct crypto_type
crypto_type就是用于重载crypto_alg中的cra_u中的各个类中的成员函数,当通过crypto_alloc_base,crypto_create_tfm等接口申请相应的crypto的TFM上下文时,若有传入crypto_type参数,TFM优先使用crypto_type中的init_tfm成员函数去初始化crypto_tfm衍生类的操作方法。
6)struct crypto_tfm
具体算法处理(transformation)上下文的实例,里面会将此次算法上下文的key,IV等信息设置到__crt_ctx中。
2.通过用例介绍crypto子系统逻辑
那我们在使用kernel中的算法时,框架内部是如何做处理的呢?下面通过一个例子来说明这个问题。在文件系统加密(FBE)中通过kernel crypto做密钥派生。
背景:在Android 7.0时,引入了文件加密功能,所谓文件加密,即每个文件都用不同的key对文件进行加密。
原理:密钥派生中,使用了crypto中的ecb(aes)算法通过类密钥及inode.nonce派生出每个文件的密钥。
具体实现在kernel/fs/crypto/keyinfo.c,如下图2.2所示:
图2.2 crypto在FBE中的应用
1)申请“ecb(aes)”算法的tfm上下文。这里会涉及到“算法动态注册”,即如果在crypto_alg_list链表中没有找到name为”ecb(aes)”的crypto_alg对象,那crypto子系统会通过一个名为”cryptomgr_probe”的内核线程查找到name为“ecb”的crypto_template对象,以及查找到name为”aes”的crypto_alg对象,动态创建出一个name为“ecb(aes)”的crypto_alg并注册到链表当中。调用流程如图2.3
图2.3 算法动态注册流程
在获取到了crypto_alg后,就会申请crypto_tfm,并用crypto_alg->cra_init()或crypto_type->init_tfm()对其进行初始化(主要是当前算法的各个函数指针)。
2) 在tfm上下文中申请一个数据处理请求(req)。一个tfm中,可以做多次数据加解密。这里只是申请内存,并关联到tfm的操作。
3) 设置密钥到tfm->__crt_ctx中。
4) 把待加密数据信息放入req当中。
5)以异步方式调用crypto_skcipher_encrypt对req做加密处理,线程在此会block一段时间,直到req请求被处理完成。因此不能在中断上下文中使用。
3.算法自检
出于安全性考虑,FIPS等相关标准要求在系统开机时必须做算法正确性自检,如果自检失败,则停止系统的启动;因此算法自检这部分自然也在框架中实现了。(源码位于:kernel/crypto/testmgr.c)
Kernel中的算法自检为静态自检,即给定输入参数,及正确结果,如果算法计算出来的结果与正确结果不匹配,则自检失败。
算法自检的时间点固定为每个crypto_alg注册的时候,具体流程如下图2.4所示:
图2.4 算法自检流程
Kernel crypto在设计时进行了高度的抽象化,本篇文章主要通过一些核心数据结构,并采用OOP角度来揭示各个struct的功能及之间的关系,以便读者能了解架构设计者的初衷。由于篇幅所限,本文未对kernel中已支持的所有算法的使用方式做介绍,这部分读者可直接参考算法自检中的代码实现。
参考文献
本文由哈喽比特于4年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/dZa_4r2bIekZ28vqkmERaQ
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。