使用加密为node.js上的jsonwebtoken创建RSA SHA256

时间:2018-09-15 17:57:06

标签: node.js encryption jwt cryptojs

我看到了如何使用Crypto和jsonwebtoken库在NodeJS中创建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});
   });

我想将'pass'替换为'RSA 256 SHA',将A替换为{algorithm:'RS256'}

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

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

to create the rsa-sha256

但是文档具有功能

getPrivateKeySomehow()

未定义或为crypto.getPrivateKeySomehow()的一部分

所以我想我只需要帮助就可以从加密返回RSA-SHA-256字符串,以便可以将其传递到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 :(得分:1)

看看下面这个例子:

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(
  • 加盐选项-padding:crypto.constants.RSA_PKCS1_PSS_PADDING