将 cryto.generateKeyPair 与 jsonwebtoken 一起使用

Posted

技术标签:

【中文标题】将 cryto.generateKeyPair 与 jsonwebtoken 一起使用【英文标题】:Use cryto.generateKeyPair with 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。

我错过了什么?

【问题讨论】:

【参考方案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 )

以上是关于将 cryto.generateKeyPair 与 jsonwebtoken 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能

php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能

将 Apollo for iOS 与现有项目集成?