【问题标题】:Use cryto.generateKeyPair with jsonwebtoken将 cryto.generateKeyPair 与 jsonwebtoken 一起使用
【发布时间】:2019-07-25 15:07:18
【问题描述】:

在节点 10 中有一个新方法 generateKeyPair,我正在使用这样的方法:

const { publicKey, privateKey } = crypto.generateKeyPairSync("rsa", {
  modulusLength: 4096,
  publicKeyEncoding: {
    type: "spki",
    format: "pem"
  },
  privateKeyEncoding: {
    type: "pkcs8",
    format: "pem",
    cipher: "aes-256-cbc",
    passphrase: "top secret"
  }
});

我现在正在尝试使用此 privateKey 从jsonwebtoken 创建一个 jwt:

function createJWT(id) {
  return new Promise((resolve, reject) => {
    jwt.sign(
      { id: id + "" },
      privateKey,
      { algorithm: "RS256", expiresIn: "2h" },
      (err, token) => {
        if (err) reject(err);
        resolve(token);
      }
    );
  });
}

不幸的是,这似乎不起作用:

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
    at Sign.sign (internal/crypto/sig.js:83:26)
    at Object.sign (/Users/francoisbillioud/Documents/Tests/SimpleQL/node_modules/jwa/index.js:76:45)
    at jwsSign (/Users/francoisbillioud/Documents/Tests/SimpleQL/node_modules/jws/lib/sign-stream.js:32:24)
    at SignStream.sign (/Users/francoisbillioud/Documents/Tests/SimpleQL/node_modules/jws/lib/sign-stream.js:58:21)
    at SignStream.<anonymous> (/Users/francoisbillioud/Documents/Tests/SimpleQL/node_modules/jws/lib/sign-stream.js:46:12)
    at Object.onceWrapper (events.js:273:13)
    at DataStream.emit (events.js:182:13)
    at DataStream.<anonymous> (/Users/francoisbillioud/Documents/Tests/SimpleQL/node_modules/jws/lib/data-stream.js:32:12)
    at process._tickCallback (internal/process/next_tick.js:61:11)

你可以看看here

我错过了什么?

【问题讨论】:

    标签: javascript node.js jwt


    【解决方案1】:

    通过提供密码和密码,私钥将根据documentation 使用基于密码的 PKCS#5 v2.0 加密进行加密。 jsonwebtoken 模块声明如下:

    如果是带有密码的私钥对象 { key, passphrase } 可以使用(基于加密文档),在这种情况下,请确保您 通过算法选项。

    如果您确实需要加密私钥,则需要保存用于生成私钥的密码短语,并在您的sign() 函数中提供它。

    let passphrase = 'top secret'
    
    const { privateKey } = crypto.generateKeyPairSync("rsa", {
      modulusLength: 4096,
      publicKeyEncoding: {
        type: "spki",
        format: "pem"
      },
      privateKeyEncoding: {
        type: "pkcs8",
        format: "pem",
        cipher: "aes-256-cbc",
        passphrase
      }
    });
    
    function createJWT(id) {
      return new Promise((resolve, reject) => {
        jwt.sign(
          { 
            id: id + "" 
          },
          {
            key: privateKey,
            passphrase
          },
          { 
            algorithm: "RS256", 
            expiresIn: "2h" 
          },
          (err, token) => {
            if (err) reject(err);
            resolve(token);
          }
        );
      });
    }
    

    【讨论】:

    • 哦!好的,非常感谢你!所以如果我做对了,我可以从privateKeyEncoding 中删除passphrase 属性,或者提供一个{key, passphrase} 对象作为jsonwebtoken 的私钥?我马上试试。
    • 如果您的系统内不需要加密私钥本身,则必须删除 generateKeyPairSync() 函数调用中的 cipherpassphrase 字段。如果你觉得你需要,那么是的,{key, passphrase} 对象作为 jsonwebtoken 的私​​钥
    • 好的。事实上,我还需要删除 cipher 字段。非常感谢。
    • 太好了,很高兴我能提供帮助。
    • web是否需要传递同一个对象进行验证,比如jwt.verify(token, { key, passphrase })
    猜你喜欢
    • 2017-05-03
    • 2023-04-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多