В узле 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)
Вы можете посмотреть здесь.
Что мне не хватает?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


При предоставлении шифра и парольной фразы закрытый ключ будет зашифрован с помощью шифрования на основе пароля PKCS#5 v2.0 в соответствии с документация. В модуле jsonwebtoken указано следующее:
In case of a private key with passphrase an object { key, passphrase } can be used (based on crypto documentation), in this case be sure you pass the algorithm option.
Если вам действительно нужно зашифровать закрытый ключ, вам необходимо сохранить парольную фразу, используемую при криптографическом создании закрытого ключа, и указать ее в своей функции 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);
}
);
});
}