随着我国商用密码技术的应用推广,国产密码算法软件引擎(或者称为密码算法软件模块、密码算法软件实现、软件密码产品等)已经成为必不可少的密码产品形态。

相比于硬件形式的密码产品,密码算法软件引擎具有更好的适用性和灵活性、更低的成本;然而,密码算法软件引擎也面临着更大的技术挑战。本文分析了国产密码算法软件引擎面临的主要安全挑战:随机数发生器和密钥安全。

相比美国 NIST 的随机数发生器标准体系,我国的相关标准尚未完善,仍然需要不少工作。密码软件引擎运行在不完全可信的通用计算机软硬件环境上,密钥数据面临着各种攻击(包括系统软件攻击和物理攻击等)。在各种计算机系统上,各种漏洞和攻击层出不穷,设计密钥安全方案、保护密钥数据,也是困难重重。

由于随机数发生器的标准体系尚未建立、密钥数据的安全技术挑战并未完全解决,有效开展国产密码算法软件引擎的安全检测,也存在着明显的困难。

在密码算法软件引擎的检测过程中,需要对软硬件运行环境设定合理的假设,进而检测密码算法软件引擎是否在该假设前提下,产生不可预测的随机数和有效地保护密钥数据。

国产商用密码技术的应用推广

密码技术是网络空间安全的重要基础,在计算机和网络系统中发挥了不可替代的安全作用。推广国产密码技术、应用商用密码算法, 是建设我国网络空间安全基础设施的必要措施之一。

全面推广国产密码技术、深入应用商用密码算法,有如下三方面工作需要完成:

(1)密码算法标准化

目前我国已经制定并公开发布了完整的密码算法体系:分组密码算法 SM4、流密码算法 ZUC、杂凑算法 SM3、公钥密码算法 SM2(包括加解密、数字签名和密钥协商)和标识密码算法 SM9。而且,其中部分密码算法已经成为国际标准。

(2)制定配套的密码应用标准

在数字证书、通信协议、应用接口等方面,形成配套标准, 实现商用密码应用标准体系。

(3)形成多元化的密码产品生态

各种不同形式的硬件、固件和软件密码产品,满足应用系统的不同需求;尤其是软件密码产品,更具有技术灵活性、实施部署更容易,在成本上也更具优势。

在商用密码算法和密码应用标准方面,我国已经发展多年。然而,在密码产品多元化方面, 一方面由于历史原因,我国商用密码长久以来只支持合规的硬件产品,近年来合格软件密码产品已经开放、但是软件密码产品发展仍然较弱;另一方面也由于软件密码产品面临着更大的技术挑战,尤其是密钥安全,所以在软件密码产品(或者称为软件密码引擎、密码算法软件模块)方面,还有更多的技术难题需要克服。

国产密码算法软件引擎的安全挑战

从密码学基本原理出发,密码算法公开, 密码产品最重要的、最需要保护的数据就是密钥以及各种敏感参数。

按照 GM/T 0028《密码模块安全技术要求》和 GM/T 0039《密码模块安全检测要求》,密码模块尤其需要确保关键安全参数和敏感参数的安全,其中最重要的参数就是密钥。

密码算法的密钥以及各种敏感参数(例如,IV 和 Nonce 等),通常都是由随机数产生获取;另一方面,确定性随机数发生器也通常是带有密钥的密码功能模块;二者相互联系、密不可分。

相比于硬件形式的常见密码算法实现(例如,密码机、密码卡、USB 令牌等),密码软件引擎面临着更大的安全挑战。

首先,密码算法软件引擎通常运行在常规的计算机系统或移动智能终端上,这一类设备不带有专用的随机数发生器芯片,密码算法软件引擎必须自己实现随机数发生器。

其次,因为密码软件引擎与其他功能的软件共享操作系统等软硬件运行环境,由于各种应用功能的要求千变万化,必然会导致操作系统功能复杂、运行环境接口繁多,就可能会引入更多的计算机软件漏洞和攻击威胁。

所以,密码软件引擎在实现灵活、成本低廉、易于实施的同时,又成为安全挑战最大的密码实现。

2.1随机数发生器的挑战

随机数发生器是各种密码计算参数的来源, 包括密钥、初始化向量、随机填充值等,应该具备足够随机性(即信息熵)、从而确保攻击者不可预测。

在计算机系统中,如何利用外界环境的不确定因素(即熵源),构造不可预测的、高速的随机数发生器,已有大量的相关研究, 美国 NIST 也在这一方面形成了较为完善的技术标准体系。下文逐一展开介绍。

Linux 内核也带有了随机数发生器软件实现,并且在很多密码软件引擎中使用。然而必须要看到,即使是美国 NIST 制定多年的随机数发生器系列标准,也仍然不时有安全问题披露;同时,即使是被大量使用的、公开源代码的随机数发生器软件实现,也时有安全漏洞出现。

2.1.1美国 NIST 的随机数发生器标准体系

随机数发生器,大致可以分为 NRBG (Non- deterministic Random Bit Generator 非确定性随机数发生器,或者称为 True Random Bit Generator 真随机数发生器) 和 DRBG (Deterministic Random Bit Generator 确定性随机数发生器, 或者称为Pseudorandom Bit Generator 伪随机数发生器 )。

目前,美国 NIST 制定的随机数发生器相关的 FIPS 标准主要包括如下:

(1)SP 800-22 A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications,随机数发生器的统计检测。

(2)SP 800-90A Recommendation for Random Number Generation Using Deterministic Random Bit Generators,根据外部输入的熵源, 使用对称密码或 Hash 等算法计算得到确定性随机数。

(3)SP 800-90B Recommendation for the Entropy Sources Used for Random Bit Generation, 随机数发生器的熵源分析。

(4)SP 800- 90C Recommendation for Random Bit Generator (RBG) Constructions, 随 机数发生器的系统构造,NRBG、DRBG 和熵源以及在线检测部件的组成。

(5)0SP 800-108 Recommendation for KeyDerivation Using Pseudorandom Functions,利用伪随机数函数实现密钥派生。

以上各标准之间关系如图 1 所示。

图 1 美国 NIST 的密码随机数发生器标准体系

首先,SP 800-90A 描述了多种确定性随机数发生器的算法,其基本原理是:发生器维护密钥和内部状态,间断地从外部获得熵源输入,计算输出随机数。

SP 800-90B 是 DRBG 随机数发生器的熵分析,用于评估和分析外部输入的熵源。

SP 800-90C 是随机数发生器的系统构造,给出 NRBG、DRBG 和熵源以及在线检测部件的多种组成方式,形成实际使用的随机数发生器。

其次,随机数发生器(主要是 NRBG)输出的随机数序列,可使用 SP 800-22标准给出的多项统计检测方法来进行检测,判断其随机性优劣。

最后,SP 800-108 给出了使用伪随机数函数来实现密钥派生的多种方法。

2.1.2随机数发生器标准及其使用的问题

下文结合现实的软件随机数发生器安全漏洞、分析讨论随机数发生器标准及其使用的问题。

根据 Snowden 报告以及大量相关研究,在SP 800-90A 标准 2006 版所包括的 Dual EC 算法中,美国 NSA 植入后门、可以预测使用该算法的随机数发生器输出;SP 800-90A 标准 2014版去掉了 Dual EC 算法。SP 800-22 标准的随机数统计检测方法、SP 800-90C 标准的熵分析方法,根据中科院 DCS 中心的研究成果,也存在着缺陷,影响到统计检测的准确性、熵分析结果的准确性 。

随机数发生器标准也不能完全解决现实密码算法软件引擎中的随机数问题。例如,2012 年的国际研究结果表明,Internet 大量网络设备的 RSA 密钥对相同,或者使用了相同的素因子、导致 RSA 密钥可分解。

上述问题一方面是因为大量网络设备使用了厂商预置的、相同的默认密钥,也有部分是因为随机数发生器问题:虽然这些设备使用了高强度的随机数发生器,但是由于网络设备的特殊性,使得不同设备的随机数发生器很容易在初态一致的情况下输出随机数并用于生成密钥,所以就会有相同的 RSA 素因子。类似问题,也在智能IC 上也有发现。

2.1.3我国商用密码随机数发生器标准

相比美国 NIST 制定的随机数发生器标准体系,我国商用密码的随机数发生器相关标准仍有不足。

国家密码管理局已经发布GM/T 0062《密码产品随机数检测要求》标准。该标准的作用大致相当于 NIST SP 800-22 标准。但是,我国尚未发布随机数发生器相关的其他标准。

总体而言,相比 NIST SP-800 在随机数发生器方面的系列标准,我国尚未形成体系化的、类似定位的随机数发生器系列标准。

考虑到密码技术的特殊性,我国没有必要照章抄袭或者模仿 NIST SP-800 的随机数发生器系列标准,但是制定类似定位、发挥相同作用的商用密码系列标准是有必要的。

尤其是,随着密码算法软件引擎的需求日益增长,我国亟需随机数发生器标准,从而能够更好地引导密码算法软件引擎的随机数发生器设计。

2.2密钥安全的挑战

密码算法软件引擎运行在通用计算机平台上,相比硬件形式实现,不但有侧信道攻击威胁, 计算机系统的各种攻击也会直接威胁到密钥数据的安全。

2.2.1密钥面临的各种攻击和安全威胁

在密码算法执行过程中,攻击者可以通过各种方法窃取其中的密钥数据。

首先,侧信道攻击是密码学研究中长久以来的重要方向。

在密码计算过程中,当密钥比特有不同取值时, 密码计算的执行会有细微差异、进而影响到可被攻击者观测到的外部状态(例如,功率、电磁辐射、计算时间、声音、高速缓存状态等等)。不论是软件形式或者硬件形式的密码算法实现, 都有侧信道攻击的威胁。

其次,由于在计算机系统中,密钥也同样表现为内存空间中的数据变量,所以现有计算机系统中各种敏感数据所面临的攻击和安全问题,也同样会威胁到密钥。

这一类型的安全威胁大致可以分为:物理攻击、软件攻击和 CPU 硬件漏洞攻击。物理攻击是指攻击者与被攻击系统有物理接触,然后利用物理接触条件、非授权地读取敏感数据。最典型的物理攻击是冷启动攻击和 DMA 攻击。

冷启动攻击 利用内存芯片数据的延迟消失,在断电之后、内存芯片的数据仍然维持一段时间,在低温情况下能够维持更长时间、甚至数小时。

攻击者可以直接取出计算机系统的内存芯片,放在攻击者控制的恶意计算机上,读取其中的敏感数据;或者在受害者计算机上插入恶意的引导介质,启动之后立即读取原有的内存数据。DMA 攻击是指攻击者插入恶意外设,发起 DMA 请求、绕过操作系统的访问控制,直接访问内存 。

其次,各种计算机系统的软件内存漏洞, 也会导致攻击者非授权地读取密钥。例如, 操作系统软件漏洞,会导致恶意进程绕过操作系统的内存隔离机制、读取其他进程甚至内核空间的内存数据。

软件系统的正常功能也有可能导致内存数据泄露,例如 Core dump 或者Crash report 就有可能使得内存中的敏感数据扩散。而且,近年来有多个 CPU 硬件漏洞被披露( 包括 Meltdown、Spectre、Foreshadow/L1TF 和ZombieLoad 等),这些漏洞都有可能使得攻击者读取到内存中的密钥等敏感数据。

最后,密码算法软件引擎在实现中也会引入安全漏洞、导致密钥泄露。例如,著名的OpenSSL 心脏出血,就是因为软件引擎在处理TLS 心跳请求消息时存在缺陷,收到畸形请求消息,会将内存空间中随机地址的 64K 字节发送给攻击者。

2.2.2现有密钥安全技术进展

在通用的计算机平台上,如何保护密钥、提供安全有效的密码计算,一直都是学术界和工业界共同关注的重要技术问题。

首先,Windows操作系统的 CSP (Cryptographic Service Provider) 和 CNG (Cryptographic Next Generation) 都支持在内核空间中执行密码运算,密钥数据出现在内核内存空间;类似的,Linux 操作系统在 v2.5.45 之后,也有内核空间的密码计算服务,称为 Crypto API。

由于密钥数据出现在内核空间,普通的用户态攻击者必须提升权限、获得内核空间的读权限,才能够读取密钥数据。

基于寄存器的密钥安全技术,可以有效防范冷启动攻击。2010 年,TRESOR 利用 Intel 完CPU 的 AES-NI 指令,完成了寄存器实现的 AES 算法,有效抵抗冷启动攻击 。

后续研究工作将其推广到 RSA 算法,在 Intel CPU 计算机上完成寄存器实现的 RSA 算法 ,同样能够抵抗冷启动攻击。

2014 年,中科院 DCS 中心研究团队第一次完成了基于 CPU 高速缓存的密码算法软件实现,在 Intel CPU 上、利用高速缓存的工作模式配置,将 RSA 私钥计算限定在 CPU 高速缓存内。

相比基于寄存器的密码算法软件实现,高速缓存的存储空间足够大、能够支持更多类型的密码算法,而且支持使用高级语言实现、不需要使用汇编实现。

2015 年,中科院DCS 中心研究团队继续提出了基于硬件事务内存的密钥安全方案,使用 Intel TSX (Transactional Synchronization Extension) 硬件事务内存特性,完成了密钥安全方案:私钥只有在需要密码计算的时候,才解密到硬件事务中、开始密码计算;在此期间,任何来自其他恶意线程或进程的读取访问,都会导致事务回滚、密钥数据被清零。

而且,Intel TSX 特性利用高速缓存来存储事务中间过程的、未提交的数据,所以该方案也能够保证 RSA 私钥不会出现在内存芯片,有效抵抗冷启动攻击。

近年来,Intel 公司推出 SGX (Software Guard eXtension) 特性,用于在不可信的操作系统和虚拟机监控器上创建执行环境,该环境只依赖于 CPU 的安全特性、提供代码的完整性和数据的机密性,并且能动态地执行远程证明。利用Intel SGX 特性,也能够实现密码算法软件引擎,提高密钥数据的安全程度。

基于 Intel SGX 特性的软件系统,其安全性完全依赖于 Intel CPU, 甚至操作系统、虚拟机监控器也不能得到用户软件系统代码或数据的任何信息。

从另一角度而言,闭源的 CPU 硬件设计和实现,也会同样面临多年前对于非开源操作系统的质疑和担忧。而且,针对 SGX 执行环境的有效攻击方法也不断被提出 。

2.2.3密钥安全技术的应用实施

对于各种不同类型的侧信道攻击,可以通过安全增强的密码算法实现来防御。学术界已经对侧信道攻击防御有很长时间的研究,研究成果也开始逐步应用到一些开源密码软件,但是仍然值得继续扩大应用范围。

尤其对于密码算法软件实现,近年来出现了多种基于共享高速缓存的侧信道攻击,这一类攻击在原有传统密码硬件实现中并不存在,所以相同的防御技术值得继续深入研究。

各种密码算法软件引擎的密钥安全方案应用实施,都必须面对运行环境不可信的问题。

首先,作为软件程序,必须在一定程度上依赖和信任操作系统和 CPU 等硬件。

其次,对操作系统和 CPU 等硬件的信任,必须深入分析,不能简单地用“绝对信任”和“不信任”来总结;具体而言,代码完整性、操作原子性、寄存器特权级别、寄存器接口访问唯一性等,不同密钥安全方案对于运行环境有各不一样的要求和假设,运行环境只需要满足相应条件即可以、并不是完全的绝对信任和依赖。

最后,应该更辩证地考虑操作系统和CPU 等硬件之间的关系, 基础软硬件构成了密码算法软件引擎的运行环境;与此同时,操作系统和各种基础硬件之间, 也在运行过程中相互监控、相互制约,更有利于形成合理的生态。

如果运行环境的安全条件信任建立在仅有的某一特定硬件或者某一特定软件模块基础上,而该信任基础并不能被彻底地分析或证明,则采取分布式信任的技术思想更为妥当、应该将安全基础建立在多个可相互监控和制约的部件之上。

软件引擎的检测现状和难题

目前,国产密码算法软件的合规检测按照GM/T 0028《密码模块安全技术要求》和 GM/T 0039《密码模块安全检测要求》来执行。作为指导性的行业标准,GM/T 0028 和 GM/T 0039 没有对密码产品的随机数发生器和密钥安全设计做出详细的具体设计指导。

与此同时,我国在随机数发生器和密钥安全的技术方案,也尚未形成行业标准或者国家标准;所以,在检测过程中, 就只能从密码学的技术原理出发、结合密码软件产品的实际情况,提出具体技术要求。

在总体技术思想上,GM/T 0028《密码模块安全技术要求》和 GM/T 0039《密码模块安全检测要求》参考了美国 NIST FIPS 140 标准和 ISO/ IEC 19790 标准。

但是,我国仍然有必要在随机数发生器方案和密钥安全方案上,提出和实施有特色的安全要求。

作为密码算法软件实现的最重要的数据安全部分,随机数发生器和密钥安全应该在运行环境所提供适度安全保证的前提下,加强自身的安全设计、而不是完全依赖于运行环境。

目前我国商用密码算法软件模块的随机数发生器和密钥安全,仍然有较高的要求,需要外部的密码硬件模块提供一定程度的支持和协作;例如,外部输入的真随机数作为熵源之一、利用门限密码算法与外部密码硬件模块协作保护密钥。

相比而言,美国 FIPS 140 密码模块测评要求对软件密码模块允许完全由软件实现的随机数发生器和密钥安全方案,其安全性对运行环境有更大的依赖性。

国产商用密码软件引擎的检测要求,与运行环境的安全假设息息相关。如果假定通用计算机软硬件环境能够全面地提供各种安全特性(例如,内存安全、用户身份鉴别等),则运行在之上的密码软件就可以降低安全要求;如果运行环境不能完全提供必要的安全特性,则密码算法软件模块就必须要加强自身安全性。

在密码算法软件模块的检测中,需要综合考虑密码安全技术和随机数发生器技术的发展, 需要分析各种不同计算机软硬件运行环境的安全状况,确定相应的安全要求细节和具体的检测方法步骤。

结语

总而言之,笔者认为,发展国产密码算法软件引擎,还需要在如下 3 方面开展工作:

(1)制定随机数系列标准,形成标准体系。通过技术标准,规范密码算法软件引擎的随机数发生器技术方案和安全实现。同时,在标准的实施中,尤其需要关注熵源的动态熵值和随机数发生器的有效变化。

(2)大力发展密钥安全技术。密码安全技术与计算机系统运行环境密切相关,难以形成标准化的技术方案;应该针对各种不同的运行环境和相应安全威胁,研究密钥安全技术方案。

(3)实施有特色的国产密码算法软件引擎检测要求。在软件密码引擎的运行环境安全得到有效保证之前,适当提高检测要求、适当降低对运行环境的安全假设,更有助于密码技术发挥安全效果。站在密码软件引擎的角度,运行环境应该是介于“完全可信”和“完全不可信” 之间的中间状态:如果假设运行环境的软硬件完全不可信,则几乎不可能实现满足要求的密码软件引擎;如果不考虑现实情况、假设运行环境完全可信,密码软件引擎自身缺乏必要的安全保护,也会导致密码软件引擎被攻击(例如, 密钥泄露等)。

另外,《中华人民共和国密码法》的立法工作已经在稳步推进,我国的密码科技工作也必定将会进入新的历史阶段。为了更便捷、更有效地在信息系统中发挥密码技术的安全作用, 国产密码算法软件引擎的研发势在必行。我国应该直面国产密码算法软件引擎的安全挑战, 团结更多力量,探索中国特色的商用密码技术路线。

林璟锵,研究员,信息安全国家重点实验室副主任。长期致力于网络空间安全研究,尤其是密码技术在计算机网络系统的应用。

选自《信息安全与通信保密》2019年第十一期

声明:本文来自信息安全与通信保密杂志社,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。