получить »отпечаток« от ключа RSA - PullRequest
1 голос
/ 25 февраля 2020

Используя модуль crypto, можно легко создать пару «пару» / publi c key в узле. Но как я могу вычислить «отпечаток» ключа?

OpenCrypto имеет что-то вроде этого:

crypt.getFingerprint(key, options).then(function (fingerprint) {
  console.log(fingerprint)
})

Что эквивалентно узлу криптомодуля для этого

1 Ответ

1 голос
/ 25 февраля 2020

OpenCrypto.getFingerprint экспортирует открытый ключ c RSA в формате X509 DER и создает га sh для этих данных. То же самое относится и к закрытому ключу RSA с той разницей, что закрытый ключ экспортируется в формате DER Pkcs8. Дайджест может быть указан в параметрах (по умолчанию: SHA 512), а также в том, возвращаются ли данные в виде буфера или в виде шестнадцатеричной строки (по умолчанию: шестнадцатеричная строка).

В коде NodeJS ключи могут быть сгенерированы с помощью crypto.generateKeyPair, при этом формат ключа можно указать явно. Если ключи еще не в соответствующих форматах (X509 DER и Pkcs8 DER), можно выполнить преобразования ключей для получения тех же отпечатков пальцев, которые создает OpenCrypto.getFingerprint. Подходящими функциями для этих операций являются crypto.createPublicKey или crypto.createPrivateKey. Наконец, ha sh должен быть сгенерирован с помощью crypto.createHash.

Обновление:

Отпечаток пальца - не что иное, как ха * Значение 1058 *, например, с дайджестом SHA-512 (как в OpenCrypto.getFingerprint):

var fingerprint = crypto.createHash('sha512').update(key).digest('hex'); // Fingerprint (hash) as hexadecimal string

, где ключ является публичным c или закрытым ключом в любом формате (string, Buffer, ... ). Если ключ указан как X509 DER (публичный c) или как PKCS8 DER (частный), то отпечаток соответствует , а OpenCrypto.getFingerprint.

Если ключ находится в другом формат, отпечаток также может быть определен таким образом. Однако, если отпечаток должен соответствовать значению, предоставленному OpenCrypto.getFingerprint, ключ, конечно, должен быть преобразован в форматы, используемые OpenCrypto.getFingerprint до того, как будет сгенерирован ha sh. Это преобразование не очень сложное, например, преобразование открытого ключа PEM c PKCS1 (publicKey) в ключ DER X509 (publicKeyDER), включая генерацию ha sh:

var publicKeyDER = crypto.createPublicKey(publicKey, { type: 'pkcs1', format: 'pem' }).export({ type: 'spki', format: 'der' }); // Convert a public PKCS1 PEM key into a X509 DER key
var fingerprint = crypto.createHash('sha512').update(publicKeyDER).digest('hex');                                               // Fingerprint (hash) as hexadecimal string

Суть в том, что это функционально те же самые операции, которые выполняются в OpenCrypto.getFingerprint. Насколько мне известно, в модуле NodeJS crypto нет аналога OpenCrypto.getFingerprint. Но с минимальными усилиями вы можете написать свою собственную функцию, используя перечисленные выше функции crypto.

...