我有一个简单的直截了当的问题:加密的 PKCS1 RSAPrivateKey 可以导入到与 PKCS11 兼容的安全模块中,而不会将私钥暴露在客户端内存中吗?
我知道 PKCS11 明确提到 PKCS8 的 PrivateKeyInfo 作为所需的私钥格式,以便通过 C_UnwrapKey 函数将其导入。
请提供任何帮助!
在解包过程中私钥是否暴露在主机内存中完全取决于您的 PKCS#11 模块的实现。
RSA 密钥通常用对称密钥(即 AES)包装,遗憾的是,许多随普通智能卡一起提供的 PKCS#11 模块在软件中实现了对称加密算法。在这种情况下展开包括两个步骤:
然而,也有在硬件中实现对称加密算法的 PKCS#11 实现(和设备),它们能够在不将私钥暴露到主机内存中的情况下执行 RSA 密钥的解包。
您可以使用 C_GetMechanismInfo() 函数来确定您的 PKCS#11 模块是否在硬件中执行特定算法。只需检查返回的 CK_MECHANISM_INFO 结构的“标志”成员是否存在 CKF_HW 标志。
编辑:PKCS#1 到 PKCS#8 的转换
据我所知,PKCS#11 没有为 PKCS#1 密钥解包或转换指定任何标准方法。另外,我上次使用 Luna SA HSM 时,文档中有一条声明,它希望导入的密钥材料采用 PKCS#8 格式。
您可以尝试在软件中将 PKCS#1 密钥转换为 PKCS#8,但如果不将私钥解密到主机内存中,恐怕是不可能的。将未加密的 PKCS#1 密钥转换为 PKCS#8 密钥相当容易 - 您只需将 PKCS#1 RSAPrivateKey 序列插入 PKCS#8 PrivateKeyInfo 序列,指定版本、privateKeyAlgorithm 即可。但是要转换加密的 PKCS#1 密钥(整个 RSAPrivateKey 序列被加密),您首先需要对其进行解密,将其转换为 PKCS#8 PrivateKeyInfo 序列,然后加密 PKCS#8 PrivateKeyInfo 序列,将加密的 PrivateKeyInfo 插入 EncryptedPrivateKeyInfo 序列并指定加密算法。
是的你可以!使用 pkcs11-tools --keypairgen 选项来执行此操作。
例如
pkcs11-tool --module /usr/local/lib/opensc-pkcs11.so -l --pin 648219 --keypairgen --key-type rsa:1024 --id 10
见 http://linux.die.net/man/1/pkcs11-tool https://github.com/OpenSC/OpenSC/wiki/SmartCardHSM
更多细节