node.js - 在 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');
但是,文档具有功能
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);
解决方案
看看下面这个例子:
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
推荐阅读
- python - 如何从python列表中的最小值开始?
- sql - 使用 SELECT 将数据插入按表 PL/SQL 的索引
- xslt - 你可以在 XSLT 中替换一个 unicode 字符吗?
- java - 如何使用按钮更改 Textview 的值以遍历 ArrayList?
- python - Microsoft Graph - Create Teams API 返回“包含导航属性不支持的绑定请求”。
- jquery - JQuery:收到此错误未捕获的类型错误:无法读取未定义的属性“scrollHeight”
- matlab - Matlab数字滞后
- html - 带有滚动的 ui 内 100% 宽度
- python - Selenium 登录另一个会话将注销其他会话
- python - def count_dominators(项目)。在列表中查找支配者。如何让这个更有效率?