简介: Anolis OS国密是社区在Anolis OS上做的国密技术解决方案。

编者注:本文系两位演讲者整理,他们在2021年阿里云开发者大会的「开源操作系统社区和生态分论坛」上带了分享,演讲主题为《国密技术开发与实践》,为国内的基础软件生态添砖加瓦。

作者分别是阿里云技术专家张天佳与蚂蚁集团高级技术专家杨洋。张天佳主要负责Anolis OS上国密技术的开发和应用,参与实现了 libgcrypt 中的国密算法和 linux内核中的 SM2 算法;杨洋则主导开发了 BabaSSL,也是国内唯一的一个 OpenSSL maintainer,参与起草并推动 RFC8998 标准国际化。相信两位技术人的干货分享,能给开发者们带来一定的思考。

以下为技术内容解析:

国密——密码算法的国产化

说到密码算法,大家一定很熟悉 MD5,AES,RSA 这些通用的国际标准算法,这也是目前我们普遍采用的密码学算法,它们在数据安全、通信、区块链等众多领域都有着广泛的应用。

众所周知,这些算法标准都是国外制定的,在某些情况下这会对国内信息安全有不利影响。当下有实力的国家,甚至有些大公司都制定了自己的算法标准。

顾名思义,国密就是密码算法的国产化,跟其它领域一样,密码算法的国产化已经势不可挡,这也是我们必须要做的事情。中国的国密算法为我们提供了一个新的选择,在必要的场合中可以选择替代那些国际主流算法,尤其是当下国际贸易冲突,技术封锁不可忽视的大环境下,大规模推广和采用国密算法将为国内重要的网络基础设施提供可靠的数据安全保障。

国密是什么?

我是谁,从哪里来?

国密是一个口语化的称呼,官方名称是国家商用密码,简称商密,拼音缩写是SM,这也是国密标准中具体算法名字的来源。国密是用于商用的、不涉及国家秘密的密码技术。

国密标准完全由中国密码管理局制定,主要的技术实现也基本是国内开发人员完成的,这对摆脱国外的密码技术和产品依赖是非常有利的。

到哪里去?

自2012 以来,SM2/3/4 的国密标准陆续公布,目前国密技术生态基本处于一个正在逐步走向成熟的阶段,但国内密码基础软件在采用国密算法方面仍处于碎片化的状态,比如我们经常可以看到各种个人或组织名义开源的支持国密算法的库;此外这些开源项目的安全更新和社区活跃也都做的不好。国密的推广仍然需要我们中国基础软件的开发者和用户共同努力。

2020年1月1日,《中华人民共和国密码法》正式实施,从法律层面规范了国家商用密码的应用和管理,这也为推广和应用国密提供了必要的法律保障。

与国际算法的对比

这里是国密算法和国际通用算法的一个对比,可以直观地看到国密的一个基本情况:

针对各种常用的国际能用算法类型,比如对称算法,公钥算法和消息摘要算法,国密标准都定义了对应的相同功能的国密算法,比如 SM4 提供了与 AES 同样的加密强度,并且支持各种加密模式;SM2 是基于椭圆曲线的公钥算法,同时定义了非对称加解密,数字签名和密钥交换标准,相对于 RSA,SM2 的密钥更短,但支持的加密强度却更高;SM3 是国密定义的消息摘要算法标准,摘要长度是固定的256位,强度等同于 SHA256。

除了基础的算法,国密标准也定义了TLCP国密双证书协议,用以支持国内的传输层安全协议。这里还有一个好消息,今年三月份,TLS1.3+ 国密单证书协议正式被国际标准所承认,并且以 RFC8998 标准发布,这意味着我们可以选择在TLS1.3协议中使用完整的国密套件,目前我们也在联系正规浏览器厂商支持这个标准的实施和应用。

同时国密也定义了使用国密算法的 X509 证书,使用 SM3 哈希算法,SM2 算法作为数字签名,证书类型是 SM2-with-SM3。

对开发者来说,国密提供了一个选择,可以选择从国际通用算法平滑迁移过来。除此之外,国密还有其它一些算法标准,是不太常用的,比如 SM9,ZUC 算法等。

BabaSSL 的前世今生

BabaSSL主打国密的密码算法库,与 OpenSSL 1.1.1 保持兼容,作为国密的密码算法解决方案而诞生。

BabaSSL 是基于之前蚂蚁集团和阿里集团内部的 OpenSSL 版本合并而来,并首次进行了开源。BabaSSL 的含义是:灵巧、轻快且靠谱的密码学和 SSL/TLS 工具库。

BabaSSL 的绿色商标,是基于阿里的橙色和蚂蚁的蓝色混合而来,也意味着我们希望将 BabaSSL 打造成一个灵活、小巧并且健壮的基础密码学库。

BabaSSL 目前在阿里集团和蚂蚁集团内部得到了非常广泛的使用。从具体场景来看,有如下三个方面,分别是存储网络端上的设备。其中网络服务的场景,是BabaSSL 最大的支撑场景,例如淘宝、天猫、阿里云等各种涉及到链路加密的服务器端。此外移动端 App,例如支付宝手机 App 中集成了 BabaSSL 来实现多种密码学的能力。

开源

BabaSSL 已经在去年的10月份进行了开源,目前代码是托管在 OpenAnolis 上,当前开源的版本是 8.2.0,也是我们目前最新的稳定版本。

目前 BabaSSL 在阿里内部使用的版本和开源版本之间存在一定的差异,我们目前正在逐步把内部版本的功能特性迁移到开源版本上进行开源,最终变成一个统一的开源版本,那么届时阿里内部也完全依赖于这个开源的版本,而不会再保留内部的闭源版本。

特色功能以下是 BabaSSL 当前最新稳定版本 8.2.0 的主要特色功能特性:

  • 基于 OpenSSL 1.1.1,具备 OpenSSL 1.1.1的全部能力并且保持兼容
  • 支持国密 SM2,  SM3和 SM4,并对 OpenSSL 1.1.1中所欠缺的 SM2 能力,比如 X509 证书的签发和验证功能进行了补全
  • GM/T 0024 和 TLCP 国密双证书TLS协议
  • 支持 RFC 8998:TLS 1.3+国密单证书
  • 提供了对 IETF 正在标准化过程中的 Delegated Credentials
  • 支持 IETF QUIC API 底层密码学能力
  • 更加完善的 SM2 算法支持,比如 X.509 证书签发、验签的支持
  • 正在申请软件密码模块一级资质

与OpenSSL对比

接下来是大家很关心的 BabaSSL 和 OpenSSL 这种老牌的密码算法库之间的区别:

从图上可以看到一些主要区别:

  • 对于一些新的密码学技术标准,BabaSSL 会采取一种相对激进的策略快速跟进,比如在 IETF 中一些正在标准化流程中的技术方案,例如 delegated credentials, compact TLS 等,会进行原型的实现和快速跟进,而 OpenSSL则是相对保守,因为 OpenSSL 社区的策略是原则上只实现已经发布了的国际标准和国家标准。
  • 在对于国密算法、国密协议、国密的监管合规、云计算厂商的深度集成、以及国产化硬件等方面,BabaSSL 会进行更加深度和广泛的支持,而 OpenSSL 则支持的比较有限。
  • 对于API的易用程度,由于没有历史包袱,所以 BabaSSL 可以提供更加简单易用的 API,而 OpenSSL 的 API 则相对复杂。对于资源受限的嵌入式设备,BabaSSL 会进行体积裁剪和内存使用量的规划,OpenSSL 则明确表示没有相关的计划。

未来规划

这个是一个后续 BabaSSL 未来的版本规划和特性支持,基本上是每半年一个版本,涵盖了多种新的密码领域技术的支持,包括对IETF的几个 RFC 草稿的实现、国产化硬件的支持以及未来对于后量子密码学以及同态加密等前沿技术的支持:

  • 支持 MPK
  • Encrypted SNI
  • Compressed Certificate
  • Compact TLS
  • SM算法优化
  • 支持国产化 CPU 的国密算法指令集
  • 体积裁剪,内存使用量优化
  • Tink API
  • ZUC,SM9
  • PQC
  • 同态加密算法

国密生态架构

万事俱备,有了基础国密算法支持,我们便可以构建出一个围绕国密算法展开的基础软件生态。这是一个国密生态的垂直场景,也是我们在 Anolis OS 上的国密生态架构,同时它也是一个全栈国密解决方案:从底层固件,内核,到基础密码学库,在主要链路上做国密改造,最终形成一个完整的基于国密的安全信任链条。

图上右边是一些垂直的国密应用场景,比如 SecureBoot,IMA,内核模块签名,文件完整性校验等。

到目前为止,我们已经在 linux 内核,BabaSSL,libgcrypt,gnulib 等主流的基础组件中支持了国密算法,这部分的工作都已经回馈到了上游开源社区,有兴趣的开发者可以直接拿来使用或者作为参考,这些特性功能之后也会率先在 Anolis OS 上输出,达到一个开箱即用的原生支持国密的 OS。

从中也能看到,国密生态涉及到的软件栈非常多,形态也是各种各样,要逐步完善这个生态,还有很长的路要走。近几年的国际技术封锁也给了我们做这件事的决心和动力。

目前我们已经和统信、海光等厂商有一些合作,也非常欢迎业界有兴趣的开发者能够参与到社区,一起来做这个事情,之后我们的工作都会在 Anolis 龙蜥社区以开源方式运作,秉着开放包容态度,继续补充完善这个生态,最终达到的一个目标是:整个安全信任链是完全建立在国密算法之上。

国密在 IMA 和 modsign 的应用

我们知道,密码学算法从来就是为安全服务的,我们来看两个在安全领域具体国密改造的例子。

IMA 是 linux 内核提供一个文件完整性度量架构,用于检测文件是否被恶意篡改,内核模块签名的目的是类似的,用于检测模块的发行源头是否可信。它们都提供了自己的签名工具,签名工具依赖 BabaSSL 提供的 SM2 签名文件的能力,用于在用户态做签名。

文件签名的验证是在内核里完成的,由于内核不能直接使用应用层的库,为了支持在Linux内核里验证文件签名,我们在内核里实现了国密 SM2/3/4 算法以及国密证书的支持,用来验证签名是否合法。

通过对相应软件栈的改造,我们完全基于国密算法构建了IMA和内核模块签名的安全机制,而这些之前都是由国际算法来保证的。

原文链接

本文为阿里云原创内容,未经允许不得转载。

技术解析:一文看懂 Anolis OS 国密生态 | 龙蜥专场的更多相关文章

  1. 【转帖】一文看懂docker容器技术架构及其中的各个模块

    一文看懂docker容器技术架构及其中的各个模块 原创 波波说运维 2019-09-29 00:01:00 https://www.toutiao.com/a6740234030798602763/ ...

  2. 一文看懂大数据的技术生态圈,Hadoop,hive,spark都有了

    一文看懂大数据的技术生态圈,Hadoop,hive,spark都有了 转载: 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它 ...

  3. 一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

    我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上经常一起出现.本文将带读者对这四个相似概念如何区分. 1 ...

  4. [转帖]一文看懂web服务器、应用服务器、web容器、反向代理服务器区别与联系

    一文看懂web服务器.应用服务器.web容器.反向代理服务器区别与联系 https://www.cnblogs.com/vipyoumay/p/7455431.html 我们知道,不同肤色的人外貌差别 ...

  5. [转帖]MerkleDAG全面解析 一文读懂什么是默克尔有向无环图

    MerkleDAG全面解析 一文读懂什么是默克尔有向无环图 2018-08-16 15:58区块链/技术 MerkleDAG作为IPFS的核心数据结构,它融合了Merkle Tree和DAG的优点,今 ...

  6. [转帖] 一文看懂:"边缘计算"究竟是什么?为何潜力无限?

    一文看懂:"边缘计算"究竟是什么?为何潜力无限? 转载cnbeta   云计算 雾计算 边缘计算...   知名创投调研机构CB Insights撰文详述了边缘计算的发展和应用前景 ...

  7. Nature 为引,一文看懂个体化肿瘤疫苗前世今生

    进入2017年,当红辣子鸡PD-1疗法,一路横扫多个适应症.而CAR-T治疗的“小车”在获得FDA专委会推荐后也已经走上高速路,成为免疫治疗又一里程碑事件.PD-1.CAR-T之后,下一个免疫治疗产品 ...

  8. 转载来自朱小厮博客的 一文看懂Kafka消息格式的演变

    转载来自朱小厮博客的 一文看懂Kafka消息格式的演变     ✎摘要 对于一个成熟的消息中间件而言,消息格式不仅关系到功能维度的扩展,还牵涉到性能维度的优化.随着Kafka的迅猛发展,其消息格式也在 ...

  9. [转帖]一文看懂mysql数据库本质及存储引擎innodb+myisam

    一文看懂mysql数据库本质及存储引擎innodb+myisam https://www.toutiao.com/i6740201316745740807/ 原创 波波说运维 2019-09-29 0 ...

  10. 一文看懂java io系统 (转)

    出处:  一文看懂java io系统   学习java IO系统,重点是学会IO模型,了解了各种IO模型之后就可以更好的理解java IO Java IO 是一套Java用来读写数据(输入和输出)的A ...

随机推荐

  1. 元宇宙解决方案——云端GPU在元宇宙中的作用

    GPU算力可以说是我们现在信息化时代的基础设施,在某种程度上说我们已经进入了算力时代,手机.电脑.车载等算力已经渗透到各行各业了. 当然算力对元宇宙也很重要,尤其是在可视化方面,元宇宙需要很逼真的渲染 ...

  2. springboot 低于 2.6 版本设置 SameSite=None,springboot 1.x set SameSite=none in embedded tomcat

    speingboot 使用自带的 tomcat 运行,设置 SameSite. springboot 过低的版本没有 SameSite 的属性设置,升级到 1.5.22 版本后,虽然 Rfc6265C ...

  3. 如何理解UDP 和 TCP? 区别? 应用场景?

    一.UDP UDP(User Datagram Protocol),用户数据包协议,是一个简单的面向数据报的通信协议,即对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层 ...

  4. 记录--get请求参数放在body中?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1.背景 与后端对接口时,看到有一个get请求的接口,它的参数是放在body中的 ******get请求参数可以放在body中?? 随即问 ...

  5. 开发必会系列:JavaEE持久层框架对比与hibernate主键生成策略总结

    一.持久层框架对比 ORM框架:即对象关系映射.它把数据库表映射到pojo类,然后通过对类的操作来实现对数据库的增删改查,sql语句自动生成. 对于代码开发者来说,就是在代码里先创建数据库连接对象,然 ...

  6. nginx进阶-3(32-34天)学习笔记

    nginx进阶-3(33-34天)学习笔记 知识回顾 1. nginx部署单机网站 2.nginx部署多个网站 3.nginx访问方式 4.nginx 安全 5.nginx加密访问 实战 00---n ...

  7. 如何用LOTO示波器实测LC串联谐振?

    一个电感和一个电容串联,在某个特定的频率,就会发生谐振,这个频率就是谐振频率.串联谐振电路有如下特点: 谐振时整个电路阻抗呈电阻性,阻抗最小,电流达到最大: 谐振时电感和电容两端的电压达到最大. 上图 ...

  8. linux 查询CPU相关信息

    1.获取CPU详细信息 cat /proc/cpuinfo 2.查看物理CPU个数 cat /proc/cpuinfo |grep "physical id"|sort |uniq ...

  9. VS2010插件NuGet

    下载地址 NuGet Package Manager - Visual Studio Marketplace NuGet包地址 NuGet Gallery | Home

  10. C++简单实现vector

    向量 向量是序列容器,表示可以更改大小的数组. 就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组一样高效.但与数组不同的是,它们的 ...