PKCS11导入加密的PKCS1 RSA私钥

时间:2014-02-19 20:10:56

标签: pkcs#11 hsm

我有一个简单的直接问题:可以将加密的PKCS1 RSAPrivateKey导入到兼容PKCS11的安全模块中,而不会将私钥暴露在客户端的内存中吗?

我知道PKCS11明确提到PKCS8的PrivateKeyInfo是必需的私钥格式,以便通过C_UnwrapKey函数导入它。

请帮忙!

2 个答案:

答案 0 :(得分:1)

在完全解包期间私钥是否暴露在主机内存中取决于PKCS#11模块的实现。

RSA密钥通常用对称密钥(即AES)包装,遗憾的是,许多通用智能卡附带的PKCS#11模块在软件中实现了对称加密算法。在这种情况下展开包括两个步骤:

  1. 基于软件的密钥材料解密,存储在主机内存中
  2. 将解密的密钥材料导入设备
  3. 然而,还有PKCS#11实现(和设备)在硬件中实现对称加密算法,这些实现能够在不将私钥暴露到主机内存的情况下执行RSA密钥的解包。

    您可以使用C_GetMechanismInfo()函数来确定您的PKCS#11模块是否在硬件中执行特定算法。只需检查返回的CK_MECHANISM_INFO结构的“flags”成员是否存在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序列并指定encryptionAlgorithm。 / p>

答案 1 :(得分:0)

是的,你可以!使用pkcs11-tools --keypairgen选项执行此操作。

  

e.g。   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

了解更多详情