2016-12-14 10 views
2

Я использую модуль pkcs11js для генерации ключей RSA с помощью смарт-карты HSM, как показано на рисунке here in the Example #3.node js - использовать ключ, сгенерированный SmartCard HSM с модулем NodeRSA

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 с помощью пары ключей с смарт-карты, если у кого-то есть пример того, как это сделать с другой библиотекой. Благодаря!

ответ

0

Некоторые атрибуты имеют значение по умолчанию для PKCS # 11. Для закрытого ключа это означает, что установлен CKA_PRIVATE. Это означает, что значение частного показателя (и параметров ЭЛТ) недоступно; идея заключалась в том, чтобы защитить их, используя смарт-карту, не так ли?

Обычно вы не можете получить параметры секретного ключа RSA (кроме модуля) со смарт-карты даже, если вы установите правильные значения атрибутов. Таким образом, операции с закрытым ключом не могут выполняться с использованием только программного обеспечения, такого как NodeRSA, просто потому, что требуемые значения недоступны. Вы должны будете выполнить их с помощью смарт-карты, например. используя пример 7 pkcs11js.

Хорошо, так что это для частного ключа, давайте посмотрим на операции с открытым ключом. Как вы могли догадаться, вы можете обычно извлекать атрибуты открытого ключа. Для операций с открытым ключом вам требуется модуль и публичный показатель. Они могут быть получены с использованием C_GetAttributeValue. Для этого вам нужен дескриптор объекта, который можно найти с помощью C_FindObjects (или вы можете использовать дескриптор, полученный при генерации пары ключей, очевидно).

После извлечения значений атрибутов вы можете построить из них открытый ключ и использовать их в программной реализации. Это зависит от реализации смарт-карты и библиотеки PKCS # 11, если вы также можете выполнять операции непосредственно на смарт-карте.


Что вы сейчас видите при печати keys являются (в зависимости от сеанса) объект обрабатывает публичного и частного ключа. Обычно они полностью независимы от атрибутов (значения) открытого и закрытого ключей.

+0

Спасибо, я извлекаю модуль и публичный экспонент с помощью 'C_GetAttributeValue', как вы предложили, знаете ли вы, как создать открытый ключ или как зашифровать с помощью открытого ключа на смарт-карте, используя эту библиотеку? Пример 7 для подписи/проверки, я попробовал [пример 8] (https://www.npmjs.com/package/pkcs11js#example-8) - изменение второго аргумента, но я получаю: 'Ошибка: CKR_FUNCTION_NOT_SUPPORTED', хотя Я знаю, что смарт-карта поддерживает шифрование/дешифрование RSA, поэтому я что-то делаю неправильно ... – myrmix

+0

@myrmix Библиотека PKCS # 11 также должна ее поддерживать. Часто смарт-карты поддерживают * расшифровку * с помощью закрытого ключа (для шифрования с открытым ключом на карте мало пользы). Что касается построения открытого ключа, быстрый поиск показывает «http: // nullege.com/codes/search/M2Crypto.RSA.new_pub_key' из M2Crypto, возможно, есть другие. –