Node.js 在nodejs上为jsonwebtoken使用加密创建RSA SHA256
我了解了如何使用Crypto和jsonwebtoken库在NodeJ中创建HMAC 256加密JWT。这很容易Node.js 在nodejs上为jsonwebtoken使用加密创建RSA SHA256,node.js,encryption,jwt,cryptojs,Node.js,Encryption,Jwt,Cryptojs,我了解了如何使用Crypto和jsonwebtoken库在NodeJ中创建HMAC 256加密JWT。这很容易 //encrypt & sign with HS256 const jwt = require('jsonwebtoken'); const pass = crypto.randomBytes(256).toString('hex'); const A = {algorithm:'HS256'}; const token
//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});
});
我想用“rsa256sha”替换“pass”,用{algorithm:'RS256'}替换“pass”
在node crypto JS的文档中,我看到了命令
const sign = crypto.createSign('RSA-SHA256');
但是,文档具有以下功能:
getPrivateKeySomehow()
未定义或不属于crypto.getPrivateKeySomehow()的一部分
所以我想我只需要帮助获取从crypto返回的RSA-SHA-256字符串,这样我就可以将其传递到jsonwebtoken中,以对我的JWT进行签名
注意:我不想从服务器上的静态文件中读取private.key,因为我认为对所有用户使用一个私钥会带来太大的安全风险,因此我要生成自己的256字节密码并将其存储在场外(本帖未包含)
另外,我不确定是否应该这样做(不使用命令行中的openssl之类的东西?)
请看下面的示例:
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',{…所需的密钥选项)创建密钥对
- 创建签名对象-crypto.createSign(“RSA-SHA256”)
- 要签名的字符串-SignerObject.update(str)
- 使用私钥为字符串签名-signerObject.Sign(
- 盐填充选项:crypto.constants.RSA\u PKCS1\u PSS\u padding
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);
});
}