создайте RSA SHA256, используя crypto для jsonwebtoken на nodejs - PullRequest
0 голосов
/ 15 сентября 2018

Я вижу, как создавать зашифрованные JWT HMAC 256 в NodeJS, используя Crypto и библиотеку jsonwebtoken. Это довольно просто

    //encrypt & sign with HS256
    const jwt   = require('jsonwebtoken');
    const pass  = crypto.randomBytes(256).toString('hex');
    const A     = {algorithm:'HS256'};

    const token = jwt.sign({ foo: 'bar' }, pass, A);

   //decrypt & verify
   jwt.verify(token, pass, A, function(err, decoded)
   {
      console.log('decode ',decoded);
      console.log('err    ',err);

      res.send({error:err, text:decoded});
   });

Я хотел бы заменить 'pass' на 'RSA 256 SHA', а A на {алгоритм: 'RS256'}

В документации узла crypto JS я вижу команду

const sign = crypto.createSign('RSA-SHA256');

для создания rsa-sha256

Однако тогда в документации есть функция

getPrivateKeySomehow()

Что не определено или является частью crypto.getPrivateKeySomehow ()

Так что, мне кажется, мне просто нужна помощь в получении строки RSA-SHA-256, возвращаемой из crypto, чтобы я мог передать ее в jsonwebtoken, чтобы подписать мой JWT.

Примечание: Я не хочу читать private.key из статического файла на моем сервере, потому что я считаю, что иметь один закрытый ключ для всех моих пользователей слишком большой угроза безопасности, поэтому я создаю собственные 256-байтовые пароли и храню их вне сайта (не включены в этот пост)

Кроме того, я не уверен, что мне следует делать что-то подобное (не используя что-то вроде openssl из командной строки?)

const begin = '-----BEGIN RSA PRIVATE KEY-----\n';
const enc   = crypto.randomBytes(256).toString('base64') + '\n';
const end   = '-----END RSA PRIVATE KEY-----'
const pass = sign.sign(begin + enc + end);
const A = {algorithm:'RS256'};
const token = jwt.sign({ foo: 'bar' }, pass, A);

1 Ответ

0 голосов
/ 01 июня 2019

Посмотрите на этот пример ниже:

signExample = (str) => {
    crypto.generateKeyPair('rsa', {
        modulusLength: 1024,
        publicKeyEncoding: {
        type: 'spki',
        format: 'pem'
        },
        privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem'
        }
    }, (err, publicKey, privateKey) => {
        // sign String
        var signerObject = crypto.createSign("RSA-SHA256");
        signerObject.update(str);
        var signature = signerObject.sign({key:privateKey,padding:crypto.constants.RSA_PKCS1_PSS_PADDING}, "base64");
        console.info("signature: %s", signature);
        //verify String
        var verifierObject = crypto.createVerify("RSA-SHA256");
        verifierObject.update(str);
        var verified = verifierObject.verify({key:publicKey, padding:crypto.constants.RSA_PKCS1_PSS_PADDING}, signature, "base64");
        console.info("is signature ok?: %s", verified);
    });
}

Шаги:

  • Сначала вы создаете пару ключей с помощью crypto.generateKeyPair ('rsa', {... требуемые параметры ключа
  • Создание объекта Sign - crypto.createSign ("RSA-SHA256")
  • Строка, которую нужно подписать - SignerObject.update (str)
  • Подпишите строку с помощью своего закрытого ключа - signerObject.sign (
  • Вариант с добавлением соли: crypto.constants.RSA_PKCS1_PSS_PADDING
...