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

news2024/11/13 14:49:17

          在上一篇内容当中已经使用过了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的一些基础内容,感谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka架构组成及相关内容

0. 主要参考:1. Kafka基础架构组成:2. Kafka的一些操作命令:3. Kafka 生产者消息发送流程:4. Kafka 的ack机制:5. Kafka 生产者消息发送模式(同步/异步):6. Kafka发送消息的分区策略…

元宇宙之声:nspace

nspace 行政总裁为我们介绍他在元宇宙中的最新创作以及对 2023 年的愿景。 本期节目我们邀请了 nspace 行政总裁 Ethan Liu 分享他的 The Sandbox 之旅以及他们的最新创作。 可以告诉我们更多关于 nspace 的信息吗? nspace 是一家专注于开发新的元宇宙商业模式的初创…

html 拖拽事件详解

为了使元素可拖拽,需要在标签上设置draggabletrue属性。 文本、图片和链接是默认可以拖放的,它们的draggable属性自动被设置成了true。 图片和链接按住鼠标左键选中,就可以拖放。 文本只有在被选中的情况下才能拖放。如果显示设置文本的dr…

LinkedIn工具-领英精灵参数怎么设置?

前言: 领英精灵是高端技术人员针对领英平台研发的工具。具有好友分组、备注,一键批量加-好友,批量撤-回邀请,批量群-发消息,批量导出好友资料,批量点-赞、Groups管理七大功能。通过领英精灵可提高领英开发…

Java集合进阶 | Collection接口

本专栏主要是记录学习完本专栏主要是记录学习Java中的知识点,如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 JavaWeb:🔥JavaWeb Java入门篇: 🔥Java基础学习篇 Java进阶学习篇(持续更新中&#xff0…

Three.js入门以及案例(全方位解析)

下载three.js 压缩包 github链接查看所有版本 threejs:https://github.com/mrdoob/three.js/releases 下载即可 常用的文件目录 three.js-文件包 └───build——three.js相关库,可以引入你的.html文件中。│ └───docs——Three.js API文档文件│…

【机器学习算法】模型评估 “神经网络,聚类,向量机,关联规则”算法模型的评估。

模型评估* 数据集的切割 训练-测试数据的方式、交叉验证的方式 我们通常会把数据集切割为训练数据集或者测试数据集,训练数据集用来训练模型用,测试数据集我们一般用来测试模式的实际效能怎么样。 我们在将数据分为训练和测试数据集的时候我们会使用…

go-zero使用consul作为注册中心

目录 在rpc服务中添加配置 导入包: 在rpc服务中添加配置: 引入 Consul config 配置项 user.yml 文件 修改 user.go,将 rpc注册到consul rpc的发现 在api服务中添加配置: 修改api/etc/user.yam 文件 修改 user.yml 修改api/user.go …

@Import的用法

官方定义: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#spring-core Using the ImportAnnotation Much as the <import/> element is used within Spring XML files to aid in modularizing configurations, the Import annotat…

一文详解ARP报文格式及工作原理

ARP&#xff08;地址解析协议&#xff09;作用&#xff1a;将目的IP解析为目的MAC&#xff0c;用于二层帧结构的目标MAC封装&#xff0c;数据必须封装为帧才能够被网卡发送出去&#xff0c;帧中必须包含MAC。报文格式&#xff1a;ARP报文不能穿越路由器&#xff0c;不能被转发到…

基于飞桨实现钢铁企业废钢判级迈入智能化道路

目前&#xff0c;国家“双碳”战略与“数据智能”环境正驱动着钢铁企业废钢判级迈入智能化道路。针对生产过程中带来高能耗和高污染问题&#xff0c;企业通过使用飞桨用友废钢智能判级系统&#xff0c;助力提升自身经济效益和安全生产水平。 建设背景 目前&#xff0c;国家“双…

如何在IDEA中创建Web项目

&#x1f44c; 棒棒有言&#xff1a;也许我一直照着别人的方向飞&#xff0c;可是这次&#xff0c;我想要用我的方式飞翔一次&#xff01;人生&#xff0c;既要淡&#xff0c;又要有味。凡事不必太在意&#xff0c;一切随缘&#xff0c;缘深多聚聚&#xff0c;缘浅随它去。凡事…

QT入门Buttons之QToolButton

目录 一、界面布局介绍 1、布局器中的位置及使用 2、控件的界面属性 2.1对象名称和大小设置 2.2对象文本设置和鼠标箭头更改 2.3、扁平化样式 二、属性功能介绍 1、显示箭头属性 2、按钮风格 3、添加默认action属性 三、Demo展示 此文为作者原创&#xff0c;转载请标…

Web前端:提高React Native应用程序性能的技巧

不可否认&#xff0c;React Native是开发混合应用的未来。它提供了可扩展性、灵活性、速度、敏捷性、成本效益和卓越的性能。难怪这么多成功的公司依赖React Native来构建他们的应用程序。毕竟&#xff0c;在互联网时代&#xff0c;每个企业都需要一个高性能的应用程序来满足客…

PCB如何进行阻抗设计经验总结

&#x1f3e1;《总目录》 目录1&#xff0c; 什么是阻抗匹配2&#xff0c;为何要阻抗匹配3&#xff0c;阻抗设计经验1&#xff0c; 什么是阻抗匹配 阻抗是指电路中两点间电阻&#xff0c;电感和电容的总称。而阻抗匹配是指&#xff0c;传输线及传输线两端的电子元器件的输入或输…

Canvas(HTML 5 元素)之绘制曲线图形

文章目录参考描述模板圆形圆形半圆形互补弧形arc()arcTo()二次贝塞尔曲线三次贝塞尔曲线参考 项目描述搜索引擎BingCanvas 中文网CanvasRenderingContext2DW3schoolHTML Canvas 参考手册从 0 到 1&#xff1a;HTML 5 Canvas 动画开发莫振杰 描述 项目描述Edge109.0.1518.70 (…

1.Java基础入门

目录 一.java概述 1.1 java语言发展史 1.2 为什么用Java 1.3 Java能做什么 1.4 Java技术体系 二.Java快速入门 2.1 如何使用Java 2.2 JVM&#xff0c;JRE&#xff0c;JDK 2.2.1 JVM 2.2.2 JRE 2.2.3 JDK 2.3 JDK的下载和安装 2.3.1 JDK的下载 2.3.2 JDK的安装 2.3.3 如何验证JD…

git版本回滚详解

写在前面&#xff1a;本文图片中出现的git st, git co分别是git status和git checkout的简写&#xff0c;使用中可以自行设置git config --global alias.st statusgit config --global alias.co checkout查看git配置文件 vim ~/.gitconfig1 工作区内的回滚操作当工作区的文件发…

Android 传感器概述(二)

Android 传感器概述&#xff08;二&#xff09;Android 传感器概述&#xff08;二&#xff09;运动传感器使用重力传感器使用线性加速度计使用旋转矢量传感器使用有效运动传感器使用计步器传感器使用步测器传感器使用原始数据使用加速度计使用陀螺仪使用未经校准的陀螺仪Androi…

【数据结构】动图详解单向链表

目录 1.什么是链表 1.问题引入 2. 链表的概念及结构 3. 问题解决 2.单向链表接口的实现 1.接口1&#xff0c;2---头插&#xff0c;尾插 2. 接口3&#xff0c;4---头删&#xff0c;尾删 3. 接口5---查找 4. 接口6&#xff0c;7---插入&#xff0c;删除 5. 接口8---打印 6. 注意…