节点js – 使用由SmartCard HSM和NodeRSA模块生成的密钥

我使用模块pkcs11js来生成具有智能卡HSM的RSA密钥,如示例#3所示 。

var publicKeyTemplate = [ { type: pkcs11js.CKA_CLASS, value: pkcs11js.CKO_PUBLIC_KEY }, { type: pkcs11js.CKA_TOKEN, value: false }, { type: pkcs11js.CKA_LABEL, value: "My RSA Public Key" }, { type: pkcs11js.CKA_PUBLIC_EXPONENT, value: new Buffer([1, 0, 1]) }, { type: pkcs11js.CKA_MODULUS_BITS, value: 2048 }, { type: pkcs11js.CKA_VERIFY, value: true } ]; var privateKeyTemplate = [ { type: pkcs11js.CKA_CLASS, value: pkcs11js.CKO_PRIVATE_KEY }, { type: pkcs11js.CKA_TOKEN, value: false }, { type: pkcs11js.CKA_LABEL, value: "My RSA Private Key" }, { type: pkcs11js.CKA_SIGN, value: true }, ]; var keys = pkcs11.C_GenerateKeyPair(session, { mechanism: pkcs11js.CKM_RSA_PKCS_KEY_PAIR_GEN }, publicKeyTemplate, privateKeyTemplate); 

如果我打印的keys ,我会得到像这样的东西:

 { privateKey: <Buffer 70 97 f7 03 00 00 00 00>, publicKey: <Buffer b0 ea f2 03 00 00 00 00> } 

现在我想用NodeRSA模块进行encryption/解密,但不知道如何使用之前生成的密钥对来创build用于encryption/解密的密钥对象(具有new NodeRSA(...) )。

不需要使用NodeRSA,我只需要一种方法来使用智能卡中的密钥对在Node JS中进行encryption/解密,以防有人举例说明如何在另一个库中执行此操作。 谢谢!

某些属性具有PKCS#11的默认值。 对于私钥,这意味着CKA_PRIVATE被设置。 这意味着私有指数(和CRT参数)的值不可访问; 这个想法是用智能卡来保护他们,对吧?

通常, 即使您设置了正确的属性值,也无法从智能卡中检索RSA私钥参数(模数除外)。 因此私钥操作不能使用仅软件实现(如NodeRSA)执行,仅仅因为所需的值不可用。 您必须使用智能卡执行它们,例如使用pkcs11js的示例7


好吧,这就是私钥,让我们来看看公钥操作。 正如你可能已经猜到,你通常可以检索公钥的属性。 对于公钥操作,您需要模数和公开指数。 这些可以使用C_GetAttributeValue进行检索。 为此,您需要使用C_FindObjects可以find的对象句柄(或者可以使用生成密钥对时检索的句柄)。

检索属性值后,您可以从中构build公钥并在软件实现中使用它们。 如果您也可以直接在智能卡上执行操作,则取决于智能卡和PKCS#11库实现。


当前打印keys时,您所看到的是公钥和私钥的(会话相关)对象句柄。 这些通常完全独立于公钥和私钥的属性(值)。