PKCS #11 -标准套餐简介
PKCS #11 是一种标准,用于为保存加密信息并执行加密功能的设备指定名为 Cryptoki的应用程序编程接口 (API)。 Cryptoki API 遵循简单的基于对象的方法。 该方法可实现技术独立和资源共享的目标,向应用程序提供称为 加密令牌的设备的公共逻辑视图。
Cryptoki 将应用程序与加密设备的详细信息隔离。 应用程序不必将接口更改为其他类型的设备或在其他环境中运行。 因此,应用程序是可移植的。 Cryptoki API 的功能组织为以下类别:
- 通用函数 (四个函数)
- 插槽和令牌管理功能 (九个功能)
- 会话管理功能 (八个功能)
- 对象管理函数 (九个函数)
- 加密功能 (四个功能)
- 解密函数 (四个函数)
- 消息摘要函数 (五个函数)
- 签署,验证和 MAC 功能 (12 个功能)
- 两用加密函数 (四个函数)
- 关键管理功能 (五个功能)
- 随机数生成函数 (两个函数)
- 并行函数管理函数 (两个函数)
并非所有 PKCS #11 函数都由 IBM Cloud® Hyper Protect Crypto Services实现。 对于已实现的 PKCS #11 函数,请参阅 支持的 PKCS #11 函数。
要查看 PKCS #11 标准文档,请参阅:
PKCS #11 实现组件
要连接和使用 PKCS #11 API,您需要了解由 Hyper Protect Crypto Services 实现的 PKCS #11 API 以及与 GREP11 API 的关系。 有关更多信息,请参阅 将 PKCS #11 API 与 GREP11 API 进行比较。 借助 PKCS #11 API 的支持,您无需更改使用 PKCS #11 标准的现有应用程序。Hyper Protect Crypto Services 还提供隔离的密钥库以存储由 PKCS #11 函数生成的密钥。 这些密钥受主密钥保护,应用程序从不会在本地看到密钥文件。
首先安装 PKCS #11 库,然后才能使用 PKCS #11 API。 通过这种方式,PKCS #11 应用程序可以与 PKCS #11 库进行交互,然后通过 gRPC调用由 Hyper Protect Crypto Services 实现的加密函数。 下图显示了由 Hyper Protect Crypto Services PKCS #11 库实现的关键组件以及不同组件之间的交互。
执行加密操作
以下部分详细说明了每个 PKCS #11 组件。
应用程序
应用程序在单个地址空间中运行。 所有控制线程都在应用程序中运行。 通过从其中一个线程调用 Cryptoki 函数 C_Initialize
,应用程序将成为 Cryptoki 应用程序。 进行此调用后,应用程序可以调用其他 Cryptoki 函数。 当应用程序完成使用 Cryptoki 时,它将调用 Cryptoki 函数 C_Finalize
,并且不再是 Cryptoki 应用程序。
如果要在 IBM Z (s390x) 平台上使用 SunPKCS11 提供程序运行 Java PKCS #11 应用程序,请确保使用最新的 IBM Semeru JVM,并在启动应用程序时指定 -Xjit:noResumableTrapHandler
Java 选项。 您可以通过在 IBM Semeru Runtime Downloads 页面上将 Architecture 过滤器字段更改为 s390x 来下载 IBM Semeru JVM 的最新 s390x 版本。
用户
PKCS #11 标准定义了两种类型的用户用于登录: 安全主管 (SO) 和普通用户。 如果用户未使用 C_Login
Cryptoki 函数登录,那么该用户也称为匿名用户。 只有普通用户才能访问令牌上的专用对象,并且只有在认证普通用户之后才会授予该访问权。 在 Hyper Protect Crypto Services PKCS #11 实现中,安全主管和普通用户通过 API 密钥进行认证。 还支持匿名用户。 有关设置 PKCS #11 用户类型的指示信息,请参阅
设置 PKCS #11 用户类型的最佳实践。
会话
Cryptoki API 要求应用程序使用令牌打开一个或多个会话,以获取对令牌的对象和功能的访问权。 会话提供应用程序与令牌之间的逻辑连接。 会话可以是读/写 (R/W) 会话或只读 (R/O) 会话。
要获取对令牌的专用对象的访问权,正常用户需要登录并进行认证。 请参阅 PKCS #11 加密令牌接口使用指南,以深入了解会话。
键对象
密钥对象存储在驻留在 PKCS #11 应用程序中的内存中密钥库中,或存储在数据库支持的密钥库中。 如果针对密钥对象将 CKA_TOKEN 属性设置为 true
,那么密钥对象将存储在数据库支持的密钥库中。 否则,密钥对象将存储在内存中的密钥库中。
在主密钥轮换之后,不会自动轮换内存中密钥库中的密钥对象。 如果在服务实例中启用了 PKCS #11 密钥库,那么在主密钥轮换完成后,需要重新启动所有活动的 PKCS #11 应用程序以清除内存中的密钥库。
如下图所示,PKCS #11 密钥对象是 PKCS #11 对象类的示例:
- 数据: 数据对象由应用程序定义。
- 证书: 证书对象存储证书。
- 密钥: 密钥对象存储密钥。 密钥可以是公用密钥,专用密钥或密钥。 这些键的每种类型都有用于特定机制的子类型。
- 公用密钥: 密钥对的公用组件,任何人都使用该密钥对来加密针对特定收件人的消息,该收件人有权访问密钥对的专用密钥。 公用密钥还用于验证专用密钥创建的签名。
- 专用密钥: 用于解密消息的密钥对的专用组件。 专用密钥还用于创建签名。
- 密钥: 密钥是生成的比特流,用于对消息进行对称加密和解密。
Cloud Identity and Access Management
IBM Cloud Identity and Access Management (IAM) 为 PKCS #11 API 的实现提供用户认证和访问控制。 通过使用 API 密钥,PKCS #11 库获取用于执行 Cryptoki API 调用的不记名令牌。
PKCS #11 的此实现将 API 密钥等同于用户的 PIN。 有关设置服务标识和相应 API 密钥的更多信息,请参阅 为 SO 用户,普通用户和匿名用户创建服务标识。
加密服务
作为 PKCS #11 库初始化过程的一部分,将建立从 PKCS #11 库到 IBM Cloud的 gRPC 连接。 gRPC 连接有助于 PKCS #11 库调用需要使用硬件安全模块 (HSM) 的 Cryptoki 函数,例如 C_Encrypt
,C_Decrypt
,C_Sign
和 C_Verify
。
密钥库
提供了两种主要类型的密钥库:
- 内存中密钥库: 将密钥对象临时存储在内存中。 存储在内存中密钥库中的密钥对象也称为 会话对象。 当您为特定会话调用
C_CloseSession
函数时,将销毁该会话中的会话对象。 调用C_Finalize
函数后,将销毁所有会话中的会话对象。 - 数据库支持的密钥库: 将密钥对象存储在数据库中。 存储在数据库支持的密钥库中的密钥对象也称为 令牌对象。 如果启用了
sessionauth
参数,并且配置了密钥库的密码,那么将对数据库支持的密钥库进行加密和认证。 缺省情况下,sessionauth
参数处于禁用状态。 对于每个服务实例,最多支持五个已认证的密钥库。 您可以启用sessionauth
参数以将生成的密钥加密到密钥库中,或者在使用该密钥之前对其进行解密。 密码可以是 6-8 个字符。
密钥库密码未存储在服务实例中。 作为密钥库管理员,您负责维护密码的本地副本。 如果密码丢失,您需要联系支持团队以重置密钥库,这意味着将清除密钥库中的所有数据。
内存中密钥库和数据库支持的密钥库都由以下类型的密钥库组成:
- 公用密钥库: 存储不太敏感且可供任何用户类型访问的密钥。
- 专用密钥库: 存储加密敏感数据的密钥以及仅供普通用户访问的密钥。
根据 用户类型 和密钥属性设置,生成的密钥将存储在不同的密钥库中。 以下列表汇总了密钥存储方式的条件:
-
CKA_TOKEN 属性值决定生成的密钥是存储在内存密钥库中还是存储在数据库支持的密钥库中。
如果要将密钥存储在数据库支持的密钥库中,请在密钥或密钥对生成模板中将 CKA_TOKEN 设置为
TRUE
。 PKCS #11 库初始化过程与 IBM Cloud建立 gRPC 连接,这有助于在数据库支持的密钥库中存储和检索密钥对象。 缺省情况下,CKA_TOKEN 设置为FALSE
,这意味着密钥对象存储在 PKCS #11 应用程序的进程地址空间内的内存中密钥库中。 -
CKA_PRIVATE 属性值决定是将普通用户生成的密钥存储在公用密钥库还是专用密钥库中。
缺省情况下,如果用户以普通用户身份登录,那么生成的密钥将存储在专用密钥库中,但 CKA_PRIVATE 设置为
FALSE
的情况除外。 如果用户以 SO 用户身份登录或未登录 (称为匿名用户),那么生成的密钥将始终存储在公用密钥库中。 如果 SO 用户或匿名用户在密钥生成模板中对TRUE
指定 CKA_PRIVATE,那么将从服务器返回错误。对于非对称密钥对,您需要为公用密钥和专用密钥分别设置 CKA_PRIVATE 属性,这意味着密钥对可以存储在不同的密钥库中。
请参阅下表,以获取有关用户类型,密钥属性和密钥库之间的关系以及密钥存储方式的详细说明。
用户类型 | CKA_TOKEN | CKA_PRIVATE | 密钥的密钥库 | 私人还是公共? |
---|---|---|---|---|
SO 用户 | FALSE |
不适用 | 内存中密钥库 | 公用 |
SO 用户 | TRUE |
不适用 | 数据库支持的密钥库 | 公用 |
匿名用户 | FALSE |
不适用 | 内存中密钥库 | 公用 |
匿名用户 | TRUE |
不适用 | 数据库支持的密钥库 | 公用 |
普通用户 | FALSE |
FALSE |
内存中密钥库 | 公用 |
普通用户 | FALSE |
TRUE |
内存中密钥库 | 专用 |
普通用户 | TRUE |
FALSE |
数据库支持的密钥库 | 公用 |
普通用户 | TRUE |
TRUE |
数据库支持的密钥库 | 专用 |
后量子密码术支持
通过 PKCS #11 API,您还可以执行 后量子加密 操作。 传统密码学依赖于复杂的数学问题,这些问题是经典计算机难以解决的。 但是,借助计算能力,量子计算机可以解决这些问题。 后量子密码学被认为对来自量子计算机的隐秘攻击具有抵抗力。 它通常使用非对称算法,并具有多种方法。
PKCS #11 API 为后量子密码术提供 Dilithium 算法。 它是一种基于点阵的数字签名方案,可用于签名生成和验证。 目前,仅支持 高安全性版本的圆形 2 Dilithium,它不可用于
C_SignUpdate
和 C_VerifyUpdate
操作。
仅 IBM 4769 加密卡 (也称为 Crypto Express 7S (CEX7S)) 支持 Dilithium 算法。 如果在使用 CEX7S 加密卡的基于 Virtual Private Cloud (VPC) 的区域中创建实例,那么可以将 Dilithium 算法与 PKCS #11 API 配合使用。 有关基于 VPC 的区域的列表,请参阅 区域和位置。
有关 PKCS #11中的 Dilithium 算法支持的更多信息,请参阅 PKCS #11 API 参考。 您还可以在 GitHub 样本存储库中找到 Dilithium 算法代码示例。