Node.JS - Как я могу подписать сообщение и проверить его с помощью ключей ED25519? - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь подключить серверы к централизованному серверу.Чтобы подтвердить их личность, я предпочитаю использовать ключи шифрования / подписи.Я бы предпочел использовать ED25519, если это возможно, но если я ошибаюсь в их возможностях для этого, пожалуйста, дайте мне знать.

Также обратите внимание, что это не SSL / SSH.Это просто общие данные, которые будут переданы приложению, которое также принимает клиентов (отсюда и необходимость проверки).Ключи послужат доказательством того, что сервер действительно является сервером, и предоставят ему необходимые права / доступ для других методов.

Я пробовал RSA и могу получить его частично работающим, но не могу его получитьзагрузить открытый ключ правильно.

Вот что у меня так далеко.Только зависимости являются ключами, которые может генерировать каждый.В этом тесте я использую ed25519 и RSA 4096-bit.

"use strict"

const fs = require("fs"),
    crypto = require("crypto");

// Let's set up some key files that can be easily rotated for testing
const keys = [
    {algorithm: 'ed25519', name: 'ed25519', passphrase: 'password', pem: false, ppk: false, pub: false, public: false, private: false},
    {algorithm: 'ed25519', name: 'ed25519_2', passphrase: 'password', pem: false, ppk: false, pub: false, public: false, private: false},
    {algorithm: 'rsa', name: 'rsa', passphrase: 'password', pem: false, ppk: false, pub: false, public: false, private: false},
];

// Select our key from the list above
const key = keys[2];
// Set a message to sign
const message = 'Hello world!';

// Load the files (that exist)
key.pem = (fs.existsSync("./" + key.name + ".pem")) ? fs.readFileSync("./" + key.name + ".pem") : false;
key.ppk = (fs.existsSync("./" + key.name + ".ppk")) ? fs.readFileSync("./" + key.name + ".ppk") : false;
key.pub = (fs.existsSync("./" + key.name + ".pub")) ? fs.readFileSync("./" + key.name + ".pub") : false;

// Verify what was loaded
console.log(key.pem.toString(), "\n\n", key.ppk.toString(), "\n\n", key.pub.toString(), "\n\n");


// At this point, we have our key data and messages. Let's continue

// Create the public/private key objecs for sign/verify
key.private = crypto.createPrivateKey({key: key.pem, passphrase: key.passphrase});
// key.public = crypto.createPublicKey(key.private);
key.public = crypto.createPublicKey({key: key.pub});


// Sign message with private key
const sign = crypto.createSign('RSA-SHA512');
sign.update(message);
const sig = sign.sign(key.private);

console.log('Signed!');
console.log(sig);

// Verify signature with public key
console.log('Verifying signature...');

const verify = crypto.createVerify('RSA-SHA512');
verify.update(message);
const verified = verify.verify(key.public, sig);

// Results?
console.log('Match:', verified);

Если я использую объект закрытого ключа для создания объекта открытого ключа, он работает.Если я использую открытый ключ, чтобы попытаться создать объект с открытым ключом, произойдет сбой.Очевидно, что мне нужно иметь открытый ключ на отдельном сервере для проверки без закрытого ключа, поэтому я в тупике.Это для ОГА.ED25519, даже не удается получить объект закрытого ключа.

Ошибка объекта открытого ключа RSA:

internal/crypto/keys.js:321
  handle.init(data, format, type);
         ^

Error: error:0909006C:PEM routines:get_name:no start line
    at Object.createPublicKey (internal/crypto/keys.js:321:10)
    at Object.<anonymous> (C:\Users\...\Desktop\test_signing\exec.js:24:21)
    at Module._compile (internal/modules/cjs/loader.js:868:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:879:10)
    at Module.load (internal/modules/cjs/loader.js:731:32)
    at Function.Module._load (internal/modules/cjs/loader.js:644:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:931:10)
    at internal/main/run_main_module.js:17:11 {
  library: 'PEM routines',
  function: 'get_name',
  reason: 'no start line',
  code: 'ERR_OSSL_PEM_NO_START_LINE'
}

Ошибка объекта закрытого ключа ED25519:

internal/crypto/keys.js:329
  handle.init(data, format, type, passphrase);
         ^

Error: error:0909006C:PEM routines:get_name:no start line
    at Object.createPrivateKey (internal/crypto/keys.js:329:10)
    at Object.<anonymous> (C:\Users\...\Desktop\test_signing\exec.js:30:22)
    at Module._compile (internal/modules/cjs/loader.js:868:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:879:10)
    at Module.load (internal/modules/cjs/loader.js:731:32)
    at Function.Module._load (internal/modules/cjs/loader.js:644:12)
    at Function.Module.runMain (internal/modules/cjs/loader.js:931:10)
    at internal/main/run_main_module.js:17:11 {
  library: 'PEM routines',
  function: 'get_name',
  reason: 'no start line',
  code: 'ERR_OSSL_PEM_NO_START_LINE'
}

Ошибкапо той же причине, но я понятия не имею, что это такое.Любая помощь будет принята с благодарностью !!!

...