node js - 使用由SmartCard HSM和NodeRSA模块生成的密钥

时间:2016-12-14 18:21:17

标签: node.js cryptography rsa pkcs#11

我使用模块pkcs11js生成智能卡HSM的RSA密钥,如here in the Example #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 module加密/解密,但不知道如何从此密钥对创建用于加密/解密的密钥对象(使用new NodeRSA(...))以前生成的。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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