将 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()
函数调用中的 cipher
和 passphrase
字段。如果你觉得你需要,那么是的,key, passphrase
对象作为 jsonwebtoken
的私钥
好的。事实上,我还需要删除 cipher
字段。非常感谢。
太好了,很高兴我能提供帮助。
web是否需要传递同一个对象进行验证,比如jwt.verify(token, key, passphrase )
?以上是关于将 cryto.generateKeyPair 与 jsonwebtoken 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy
php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - Sharedaddy
php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能
php [将产品与社交共享插件集成]将社交共享插件与WooCommerce集成 - 分享此功能