Используйте cryto.generateKeyPair с jsonwebtoken - PullRequest
0 голосов
/ 04 марта 2019

В узле 10 есть новый метод generateKeyPair, который я использую следующим образом:

const { publicKey, privateKey } = crypto.generateKeyPairSync("rsa", {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: "spki",
    format: "pem"
  },
  privateKeyEncoding: {
    type: "pkcs8",
    format: "pem",
    cipher: "aes-256-cbc",
    passphrase: "top secret"
  }
});

Я сейчас пытаюсь создать jwt из jsonwebtoken, используя этот privateKey:

function createJWT(id) {
  return new Promise((resolve, reject) => {
    jwt.sign(
      { id: id + "" },
      privateKey,
      { algorithm: "RS256", expiresIn: "2h" },
      (err, token) => {
        if (err) reject(err);
        resolve(token);
      }
    );
  });
}

К сожалению, это не похоже на работу:

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
    at Sign.sign (internal/crypto/sig.js:83:26)
    at Object.sign (/Users/francoisbillioud/Documents/Tests/SimpleQL/node_modules/jwa/index.js:76:45)
    at jwsSign (/Users/francoisbillioud/Documents/Tests/SimpleQL/node_modules/jws/lib/sign-stream.js:32:24)
    at SignStream.sign (/Users/francoisbillioud/Documents/Tests/SimpleQL/node_modules/jws/lib/sign-stream.js:58:21)
    at SignStream.<anonymous> (/Users/francoisbillioud/Documents/Tests/SimpleQL/node_modules/jws/lib/sign-stream.js:46:12)
    at Object.onceWrapper (events.js:273:13)
    at DataStream.emit (events.js:182:13)
    at DataStream.<anonymous> (/Users/francoisbillioud/Documents/Tests/SimpleQL/node_modules/jws/lib/data-stream.js:32:12)
    at process._tickCallback (internal/process/next_tick.js:61:11)

Вы можете посмотреть здесь .

Чего мне не хватает?

1 Ответ

0 голосов
/ 04 марта 2019

При предоставлении шифра и ключевой фразы закрытый ключ будет зашифрован с помощью шифрования на основе пароля PKCS # 5 v2.0 согласно документации .Модуль jsonwebtoken сообщает следующее:

В случае закрытого ключа с парольной фразой можно использовать объект {ключ, кодовая фраза} (на основе крипто документации), в этом случае обязательно передайтеопция алгоритма.

Если вам действительно нужно зашифровать закрытый ключ, вам нужно сохранить ключевую фразу, использованную при криптографическом генерировании секретного ключа, и предоставить ее в функции sign().

let passphrase = 'top secret'

const { privateKey } = crypto.generateKeyPairSync("rsa", {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: "spki",
    format: "pem"
  },
  privateKeyEncoding: {
    type: "pkcs8",
    format: "pem",
    cipher: "aes-256-cbc",
    passphrase
  }
});

function createJWT(id) {
  return new Promise((resolve, reject) => {
    jwt.sign(
      { 
        id: id + "" 
      },
      {
        key: privateKey,
        passphrase
      },
      { 
        algorithm: "RS256", 
        expiresIn: "2h" 
      },
      (err, token) => {
        if (err) reject(err);
        resolve(token);
      }
    );
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...