5

我使用 PKCS11Interop 生成密钥 API 在 HSM 中生成了一个 RSA 公私钥对。我想导出密钥对。我使用 Findobject API 来获取密钥,API 返回一个 ObjectHandle ,在使用 GetAttributeValue API 读取属性时,我无法读取密钥的值。当我将密钥的属性设置为 CKA_EXTRACTABLE 为 true 时,我无法完全生成密钥。

我还需要在 HSM 中导入外部提供的密钥对。

非常感谢任何帮助。

4

3 回答 3

2

insecure在 HSM 世界中考虑您正在尝试做的事情。它违背了拥有 HSM 的目的。

但是,能做到吗?是的。前提是 HSM 供应商应该支持它。

HSM 供应商决定在 HSM 上生成的密钥是否可以提取,或者是否可以将由任何软件(在 HSM 之外)生成的任何密钥导入硬件。PKCS#11 只是您与 HSM 交互的接口。如果 HSM 不支持某个操作,它会引发一个异常,该异常最终由 PKCS11 api 引发。

这就是您的提取和导入操作所发生的情况。您尝试执行这些操作的 HSM 可能不支持它。因此,您需要与 HSM 供应商核实如何在他们的产品上执行这些操作。

PS:Thales nShield 应该/可能有一个配置文件,您可以通过它在不安全模式下运行 HSM。

注意:提取Key/Key Pair在 HSM 上生成的(或)导入在 HSM 之外生成的任何密钥/密钥对在现实世界中不被视为不安全的操作。

于 2017-02-27T19:58:32.120 回答
0

我认为您使用的是 Safenet HSM,因为 Thales HSM 没有 GetAttributeValue、ObjectHandle 等功能。

CKA_EXTRACTABLE 表示您可以在另一个密钥下提取您的密钥,这并不意味着 您可以读取密钥数据。如果仅使用密钥句柄就可以获取密钥数据,那应该是完全不安全的。

即使在功能模块 (FM) 中也无法使用 ObjectHandle 读取关键数据。FM 是仅在 Safenet HSM 本身中运行的专有软件,它是运行 HSM 硬件的嵌入式软件。您可以使用 ObjectHandle 调用特定的 HSM 函数,如 FM 中的加密、解密。只有在另一个密钥下才能提取密钥。

您可以使用 Safenet HSM 函数调用来导入您的密钥。

于 2017-02-27T23:08:52.450 回答
0

RSA 私钥可以通过正确的属性设置导出(当然这种情况必须由 HSM 供应商提供的非托管 PKCS#11 库支持),但您需要读取多个属性(参见PKCS#11 v2的第 12.1.3 章.20 规范)提取其部分,然后自行创建密钥的 ASN.1 结构。

您需要的 ASN.1 结构的特定类型取决于您使用的密钥类型(在您的情况下是 RSA)以及将使用密钥的目标系统的功能,即加密应用程序通常使用与电子邮件代理等不同的格式. 我相信你可以从PKCS#1RSAPrivateKey中定义的结构开始。

于 2017-02-28T12:27:39.977 回答