Node.js 在nodejs上为jsonwebtoken使用加密创建RSA SHA256

Node.js 在nodejs上为jsonwebtoken使用加密创建RSA SHA256,node.js,encryption,jwt,cryptojs,Node.js,Encryption,Jwt,Cryptojs,我了解了如何使用Crypto和jsonwebtoken库在NodeJ中创建HMAC 256加密JWT。这很容易 //encrypt & sign with HS256 const jwt = require('jsonwebtoken'); const pass = crypto.randomBytes(256).toString('hex'); const A = {algorithm:'HS256'}; const token

我了解了如何使用Crypto和jsonwebtoken库在NodeJ中创建HMAC 256加密JWT。这很容易

    //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});
   });
我想用“rsa256sha”替换“pass”,用{algorithm:'RS256'}替换“pass”

在node crypto JS的文档中,我看到了命令

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

但是,文档具有以下功能:

getPrivateKeySomehow()
未定义或不属于crypto.getPrivateKeySomehow()的一部分

所以我想我只需要帮助获取从crypto返回的RSA-SHA-256字符串,这样我就可以将其传递到jsonwebtoken中,以对我的JWT进行签名

注意:我不想从服务器上的静态文件中读取private.key,因为我认为对所有用户使用一个私钥会带来太大的安全风险,因此我要生成自己的256字节密码并将其存储在场外(本帖未包含)

另外,我不确定是否应该这样做(不使用命令行中的openssl之类的东西?)


请看下面的示例:

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',{…所需的密钥选项)创建密钥对
  • 创建签名对象-crypto.createSign(“RSA-SHA256”)
  • 要签名的字符串-SignerObject.update(str)
  • 使用私钥为字符串签名-signerObject.Sign(
  • 盐填充选项:crypto.constants.RSA\u PKCS1\u PSS\u padding
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);
    });
}