Express框架中JWT基础 - 对称|非对称加密

          在上一篇内容当中已经使用过了JWT(JSONWebToken)做验证登录,采用的是对称加密的方式,那么在本篇当中来进一步的讲解关于JWT的基础使用对称以及非对称加密;先来简单的回顾上一篇内容当中使用到的对称加密:

对称加密

        首先是通过express框架创建项目环境,这里就不在演示;首先先来安装JWT所需要的依赖包,通过如下命令来安装JWT(JSONWebToken):

npm install jsonwebtoken

        安装完成之后在目录下新建一个名为controaller文件夹,然新建一个index.js文件,该文件主要就是编写关于token的内容:(当然在其他位置也行)

        同时在目录下新建一个名为tokenKey的文件夹,下面存放着一个key.txt文件(存放密钥);

在 controaller/index.js文件中编写代码:

const jwt = require('jsonwebtoken');
const fs = require('fs');
const path = require('path');

// 生成token;
const token = function(req,res,next){
    // 读取密钥
    let key = fs.readFileSync(path.join(__dirname,'../tokenKey/key.txt'))
    
    // 生成token
    // jwt.sign(参数1-载荷,参数2-密钥)
    const tk = jwt.sign({username:'admin'},key);
    res.send(tk);

    // 验证token
    // jwt.verify(参数1-token,参数2-密钥,参数3-回调err/decoded)
    let decoded = jwt.verify(tk,key)
    console.log(decoded); 
}

exports.token = token;

        通过jwt.sign()方法生成token,然后通过jwt.verify()方法验证;下面在路由文件中配置一下然后进行测试一下: /routes/index.js

// routes/index.js文件
var express = require('express');
var router = express.Router();
const { token } = require('../controaller/index')

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.get('/api/token',token)

module.exports = router;

下面通过请求 http://127.0.0.1:3000/api/token 来进行测试一下:

        可以看到将埋下的信息username:'admin'拿到了,这种方式就是以对称加密的方式,使用加密和解密的钥匙都是同属一把钥匙的;那么更加安全的是方式是什么的,就是接下来要讲到的非对称加密;


        在讲非对称加密之前呢先需要安装一下OpenSSL,因为接下来会通过使用到它来生成密钥;那么关于OpenSSL的安装以及如何生成密钥在以下的这篇内容当中已经讲了,大家可以自行看一下:

        下载安装以及如何生成密钥文件:    OpenSSL下载安装教程


        讲生成的两份密钥存到tokenKey的文件夹下,一个文件名为privateKey.pem的文件是私钥文件,而另外一个名为publicKey.pem的文件是公钥文件,可以看一下下面这两份对应的文件,私钥的文件是2048位的,而通过公钥生成的私钥反而不是,两份文件并不想一样,下面通过私钥来生成token,然后再通过公钥来解析验证token;

下面来开始编写代码:(注释刚刚代码重新编写)

const jwt = require('jsonwebtoken');
const fs = require('fs');
const path = require('path');

// 生成token;
const token = function(req,res,next){
// 非对称加密
    const privatekey = fs.readFileSync(path.join(__dirname,'../tokenKey/privatekey.pem'));// 私钥
    const publickey = fs.readFileSync(path.join(__dirname,'../tokenKey/publickey.pem'));  // 公钥

    // 生成token
    // jwt.sign(参数1-载荷,参数2-私钥,参数3-算法);
    // token —— 通过私钥生成
    const tk = jwt.sign({username:'admin'},privatekey,{algorithm:'RS256'});
    res.send(tk);

    // 验证token
    // jwt.verify(参数1-token,参数2-公钥)
    let decoded = jwt.verify(tk,publickey);
    console.log(decoded);
}

exports.token = token;

        通过jwt.sign()方法使用私钥生成token,算法是RS256;这个算法可以参考如下这个:

        通过jwt.verify()方法使用公钥来解析验证;下面就来通过请求 http://127.0.0.1:3000/api/token来进一步测试结果:

        可以看到的是依然可以正常的获取到载荷中的内容{username:'admin'};以上的内容就是非对称加密的方式,这两种方式相比较非对称加密比起对称加密安全性更高一些的,那么以上就是本篇的全部内容了,补充讲解了JWT的一些基础内容,感谢大家的支持!

猜你喜欢

转载自blog.csdn.net/weixin_52203618/article/details/128551205