nodejs学习
一、NodeJs中
1、Token的组成
Token = header.payload.signature
= base64(header).base64(payload).RSA(base64(header).base64(payload))
- Header(标头)
组成:令牌的类型(即JWT)和所使用的签名算法,签名算法例如HMAC SHA256或RSA。
let header = {
// token标头信息
"alg": "RSA", // 签名算法RSA
"typ": "JWT" // 统一jwt令牌类型
};
- Payload(有效负载)
有关实体(通常是用户)和其他数据的声明。
let payload = {
// token有效负载,可自定义
"nbf": new Date().getTime(), // 生效时间当前系统时间毫秒数
"uid": uid, // 用户uid
"lastTime": 60 * 1000 * tokenTimeout,//有限时间
}
- Signature(签名)
header和payload都是Base64编码过的,中间⽤
.隔开,Signature就是使用加密算法将header和payload合起来做签名,RSA(base64(header).base64(payload)),签名的作用是保证 JWT 没有被篡改过
2、Signature的生成
Signature = RSA(base64(header).base64(payload)),将base64编码过的header和payload拼接在一起,用RSA加密算法进行加密
-
RSA加密算法,是生成一对密钥,分别为公钥、私钥,成对存在。用其一加密,另一个解密。
token一般使用 私钥加密,公钥解密 的方式来进行签名认证
1.公钥加密,私钥解密
公钥被多人持有,对于公钥加密的信息,只有私钥才能解密,从而实现了数据可以保密的到达拥有私钥的一方。即使被第三方截取,也无法解密。
2.私钥加密,公钥解密
一般被用于数字签名。数字签名是用于防篡改和防止假冒的,因为只有一人拥有私钥。甲方通过私钥对数据进行签名,乙方通过甲方的公钥验证签名,如果成功,说明确实是甲方发来的,并且数据没有被修改。一旦相反,公钥是公开的,大家都能做签名,就没意义了。
-
RSA安装
npm i node-rsa -
//生成公钥私钥存文档,给之后加密解密使用 //通过 node xxx.js 来运行文件 const NodeRSA = require('node-rsa'); //执行文件,密钥存文档后就可以注释以下代码 let key = new NodeRSA({ b:1024}) var publicDer = key.exportKey('public'); var privateDer = key.exportKey('private'); console.log('公钥:',publicDer); console.log('私钥:',privateDer);

const NodeRSA = require('node-rsa');
const fs = require('fs')
const path = require('path')
//读取私钥加密
const rsaS = fs.readFileSync(path.join(__dirname,'../config/private.pem'));
let key = new NodeRSA(rsaS)
let signature = key.encryptPrivate(base64编码过的header以及payload,'base64')
console.log(signature)
//读取公钥解密
const rsaG = fs.readFileSync(path.join(__dirname,'../config/public.pem'));
let key = new NodeRSA(rsaG)
let designature = key.decryptPublic(signature, 'utf8')
console.log(designature)
3、token的生成与检验
-
工具类
base64编码、解码(处理payload以及header)
RSA生成加密解密key(处理signature)
class Rsa{
base64(str) {
//base64加密方法
if (typeof str !== 'string') {
str = JSON.stringify(str);
}
return Buffer.from(str).toString("base64");
}
base64decode(str=''){
//base64解密
return Buffer.from(str, "base64").toString

1304

被折叠的 条评论
为什么被折叠?



