【问题标题】:create RSA SHA256 using crypto for jsonwebtoken on nodejs在 nodejs 上使用加密为 jsonwebtoken 创建 RSA SHA256
【发布时间】:2019-02-20 04:16:08
【问题描述】:

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

【问题讨论】:

    标签: node.js encryption jwt cryptojs


    【解决方案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(
    • 加盐选项 - 填充:crypto.constants.RSA_PKCS1_PSS_PADDING

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-27
      • 2015-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      相关资源
      最近更新 更多