首页 > 解决方案 > 在 nodejs 上使用加密为 jsonwebtoken 创建 RSA SHA256

问题描述

我看到了如何使用 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});
   });

我想用“RSA 256 SHA”替换“pass”,用 {algorithm:'RS256'} 替换 A

在节点加密 JS 的文档中,我看到了命令

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

创建 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);

标签: node.jsencryptionjwtcryptojs

解决方案


看看下面这个例子:

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

推荐阅读