商用密码产品认证中的随机数(二)

1 随机数相关规范概述

现行密码标准体系中包括三类随机数相关标准:框架类标准、设计类标准和检测类标准。

  1. 框架类标准为GM/T 0103《随机数发生器总体框架》
  2. 设计类标准为用于指导随机数发生器的技术设计,包括GM/T 0078《密码随机数生成模块设计指南》、《物理混沌随机数发生器设计指南》和GM/T 0105《软件随机数发生器设计指南》。
  3. 检测类标准包括随机性检测类标准和产品应用检测类标准。

随机性检测标准是对随机数进行统计检测类标准GB/T 32915《信息安全技术 二元序列随机数检测方法》。该标准由GM/T 0005《随机性检测规范》升级而来。

产品应用检测类标准是密码产品中随机数检测的标准,规定了密码应用中随机性检测指标和要求。目前已经发布的标准为GM/T 0062《密码产品随机数检测要求》。

后面的文章我们以上述标准为基础依次展开描述随机数发生器的设计和测试方式。
如果商用密码产品认证中遇到任何问题,欢迎加微信symmrz沟通。

2 随机数生成

2.1 随机数发生概述

上一篇文章中提到了在产品设计时需要频繁使用随机数。根据产品需求和应用场景不同,获取随机数的方式也不尽相同。
A、 对于普通的商用产品,不涉及社会秩序、公共利益和国家安全的,其随机数仅满足统计学的伪随机性即可。例如,某公司开发的卡牌游戏需随机从卡包中选择一张卡牌,此时对随机数发生器无特殊要求。
B、 对于涉及社会秩序和公共利益的产品,其使用的随机数应至少为密码学安全的伪随机数。例如,某银行开发的网上银行软件系统,其保证交易安全的签名密钥应至少同时满足伪随机性和密码学安全。
C、 对于涉及威胁GJ安全的产品,随机数应由硬件随机数发生器实现的真随机数。

随机数的选择和实现方式对应关系如下表所示。“核准”代表的是需符合国家密码主管部门的认可,通常指的是通过商用密码产品认证。

产品安全等级随机数应满足要求随机数实现方式说明
被破坏后不危害国家安全、社会秩序和公共利益的产品统计学的伪随机性标准库、操作系统提供的随机数API、第三方库等方式推荐使用openssl提供的随机数接口
被破坏后严重危害社会秩序和公共利益的产品统计学的伪随机性、密码学安全“核准”的随机数发生器可以使用软件随机数发生器,但需通过商用密码产品认证
被破坏后严重危害国家安全的产品统计学的伪随机性、密码学安全、真随机数“核准”的硬件随机数发生器仅能使用通过商用密码产品认证的硬件随机数发生器

2.2 编程语言自带的标准库

通常编程语言都具备常用的随机数相关的标准库。例如C语言<stdlib.h> 头文件中定义了int rand(void)接口。Python自带的random库中也提供random.random()和random.uniform()等方法供获取随机数。

这些随机数获取方式简单易用,且具备极高的生成速度,但缺点是难以达到密码学的安全要求

2.3 操作系统提供的随机数

现代操作系统考虑到应用获取高质量随机数的需求,提供了基于运行环境的传感器作为随机熵源的随机数接口。例如,在CentOS和Ubuntu操作系统中,可以访问 /dev/random 和 /dev/urandom两个文件获取随机数。其中:
1) /dev/random 是阻塞的随机数发生器,读取有时需要等待。存储着系统当前运行环境的实时数据,如 CPU、内存、电压、物理信号等
2) /dev/urandom 是非阻塞随机数发生器,读取操作不会产生阻塞。
操作系统提供的随机数质量一般比标准库高,但同样无法证明其满足密码学的安全要求。同时,因为随机数文件是公开的,无法确保随机数的保密性。

2.4 第三方库

几乎所有接触密码产品的研发人员都绕不开OpenSSL,无论是实际应用或代码框架都值得我们深入学习。使用OpenSSL等第三方密码学支持库是实践中最推荐的生成随机数的方式。OpenSSL在rand.h文件中定义了随机数相关接口:
int RAND_bytes(unsigned char *buf,int num);
void seed(const void *buf, int num);
int status(void);
void RAND_screen();

实际应用中,OpenSSL提供的随机数已经足够满足伪随机性的要求。但遗憾的是,该方案未满足主管部门对随机数发生器的要求,即不是“核准”的。如需使用密码学安全的随机数,可以按照GM/T 0078或GM/T 0105自行设计随机数发生器,也可以使用”已核准”的随机数发生器。

2.5 使用符合密码行业要求的随机数发生器

多数情况下,已经获取商用密码产品认证证书的产品都具备随机数功能。例如:
1) 符合GM/T 0018规范的密码机提供了SDF_GenerateRandom接口供应用程序使用;
2) 符合GM/T 0016接口的智能密码钥匙提供了SKF_GenRandom接口供应用程序使用;
3) 安全芯片一般提供真随机数发生器供固件使用,固件可以直接调用芯片供应商提供的库;
4) 硬件产品设计时也可以直接使用专用的随机数安全芯片产生随机数;

需要注意的是,上述密码机、智能密码钥匙、安全芯片应已经获得商用密码产品认证证书,否则会被视为“非核准的随机数发生器”。

2.6 自行设计的随机数发生器

在部分情况下,我们可能需要自行设计随机数发生器。例如,在设计符合GM/T 0028要求的软件密码模块时,产品可能需要使用SM2算法或使用随机数参与SSL通道建立,此时需要我们设计符合GM/T 0105《软件随机数发生器设计指南》的随机数发生器。

下一篇文章开始会详细讲解软件密码模块的随机数发生器设计方式。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值