JWT 令牌:原理、应用与安全考量
深入理解 JWT 令牌:原理、应用与安全考量
文章目录
- 深入理解 JWT 令牌:原理、应用与安全考量
- 一、引言
- 二、JWT 令牌与传统方式的区别
- (一)传统身份验证方式的特点与局限
- (二)JWT 令牌的优势
- 三、JWT 令牌的字段
- (一)头部(Header)
- (二)载荷(Payload)
- (三)签名(Signature)
- 四、JWT 令牌在集群部署中的优势与集群部署概念
- (一)集群部署概念
- (二)JWT 令牌在集群部署中的优势
- 五、JWT 的缺点
- (一)令牌有效期管理挑战
- (二)令牌信息泄露风险
- (三)依赖密钥安全性
- 六、JWT 令牌泄露后的解决策略
- (一)短期应对:令牌黑名单机制
- (二)长期应对:重新签发令牌与加强安全措施
- 七、前端存储 JWT 的方式
- (一)Cookie
- (二)LocalStorage
- (三)SessionStorage
一、引言
在现代 Web 应用开发中,身份验证与授权是至关重要的环节。传统的身份验证方式在面对分布式系统、集群部署以及多平台交互等复杂场景时逐渐暴露出一些局限性。而 JSON Web Tokens(JWT)作为一种新兴的轻量级身份验证与授权解决方案,正得到越来越广泛的应用。本文将深入探讨 JWT 令牌与传统方式的区别、JWT 令牌的字段构成、其在集群部署中的优势、存在的缺点、令牌泄露后的应对策略、前端存储方式,并给出相关代码示例,旨在帮助开发者全面掌握 JWT 技术,以便在实际项目中做出合理的技术选型与应用。
二、JWT 令牌与传统方式的区别
(一)传统身份验证方式的特点与局限
传统的身份验证方式通常依赖于会话(Session)机制。用户登录成功后,服务器会创建一个会话并在服务器端存储相关用户信息,同时为客户端生成一个会话 ID(Session ID),客户端在后续的请求中携带该会话 ID,服务器通过验证会话 ID 来识别用户身份。这种方式存在一些问题:
- 服务器资源消耗:在大规模用户或分布式系统中,服务器需要存储大量的会话信息,这会占用大量的内存资源,增加服务器的负载。例如,在一个拥有数百万活跃用户的社交网络应用中,会话信息的存储可能会成为服务器性能的瓶颈。
- 水平扩展困难:当应用进行集群部署时,会话信息在不同服务器之间的共享与同步变得复杂。如果用户的请求被分发到不同的服务器,而这些服务器之间的会话信息不一致,可能会导致用户身份验证失败或出现异常行为。例如,在电商促销活动期间,流量剧增,应用需要动态扩展服务器数量,但会话共享问题可能会影响服务的稳定性。
- 跨平台与跨域限制:会话机制在跨平台(如移动应用与 Web 应用之间)和跨域场景下的使用不够灵活。不同平台或域之间的会话共享往往需要复杂的配置和额外的安全措施。
(二)JWT 令牌的优势
JWT 令牌是一种基于 JSON 的开放标准(RFC 7519),用于在双方之间安全地传输信息。它具有以下优点:
- 无状态性与可扩展性:JWT 令牌是自包含的,它将用户信息和相关声明编码在令牌本身。服务器不需要存储令牌相关的会话信息,这使得服务器能够轻松地进行水平扩展,适应集群部署和大规模用户场景。例如,在一个微服务架构的电商系统中,各个服务可以独立验证 JWT 令牌,无需共享会话状态,提高了系统的灵活性和可扩展性。
- 跨平台与跨域支持:由于 JWT 令牌可以方便地在不同平台和域之间传递,并且可以通过多种方式(如 HTTP 头部、URL 参数、请求体等)进行传输,因此在现代多端应用开发中具有很大的优势。例如,一个同时拥有 Web 应用、移动应用和桌面应用的企业服务,可以使用统一的 JWT 令牌进行身份验证和授权,简化了开发和维护工作。
- 简洁与高效:JWT 令牌的结构简洁明了,编码和解码相对容易,传输开销较小,能够在保证安全性的前提下提高身份验证和授权的效率。
三、JWT 令牌的字段
(一)头部(Header)
头部通常包含两部分信息:令牌的类型(typ)和所使用的签名算法(alg)。例如:
{"typ": "JWT","alg": "HS256"
}
这里表明这是一个 JWT 令牌,并且使用 HMAC SHA-256 算法进行签名。头部信息会经过 Base64Url 编码后成为令牌的第一部分。
(二)载荷(Payload)
载荷部分包含了一些关于用户的声明(Claims)信息,这些信息可以分为三类:
- 注册声明(Registered Claims):这些是 JWT 标准中预先定义的一些常用声明,如 iss(发行者)、sub(主题,通常为用户 ID)、exp(过期时间)、iat(发行时间)等。例如:
{"iss": "example.com","sub": "123456","exp": 1609459200,"iat": 1609455600
}
- 公共声明(Public Claims):可以由应用开发者自行定义的一些通用声明,用于在令牌中传递额外的用户相关信息,但要注意避免与注册声明冲突。例如,可以添加用户的角色信息:
{"role": "admin"
}
- 私有声明(Private Claims):特定应用场景下自定义的、不对外公开的声明信息,用于在应用内部传递特定的业务数据。载荷信息同样会经过 Base64Url 编码后成为令牌的第二部分。
(三)签名(Signature)
签名是使用头部中指定的签名算法,对经过编码的头部和载荷信息进行签名计算得到的结果。签名的目的是确保令牌在传输过程中没有被篡改。例如,如果使用 HS256 算法,签名计算过程如下:
// 假设 secretKey 是用于签名的密钥
const encodedHeader = base64UrlEncode(header);
const encodedPayload = base64UrlEncode(payload);
const signature = HMACSHA256(encodedHeader + '.' + encodedPayload, secretKey);
签名信息会附加在经过编码的头部和载荷之后,形成完整的 JWT 令牌,格式为:encodedHeader.encodedPayload.signature
。
四、JWT 令牌在集群部署中的优势与集群部署概念
(一)集群部署概念
集群部署是指将多个相同或相似的服务器(节点)组合在一起,共同处理应用的请求,以提高系统的性能、可用性和可扩展性。在集群环境中,用户的请求可以被分发到不同的服务器节点上进行处理。例如,在一个大型电商网站中,可能会部署多个应用服务器、数据库服务器等组成一个集群,通过负载均衡器将用户的请求均匀地分配到各个应用服务器上,以应对高流量和高并发的场景。
(二)JWT 令牌在集群部署中的优势
由于 JWT 令牌是自包含的,服务器不需要在本地存储与令牌相关的会话信息。在集群部署中,无论用户的请求被分发到哪个服务器节点,该节点都可以独立地验证 JWT 令牌的有效性。例如,当用户登录成功后,服务器生成一个 JWT 令牌并返回给客户端,客户端在后续的每个请求中都携带这个令牌。不同的服务器节点接收到请求后,只需使用相同的密钥和算法验证令牌的签名、检查令牌的过期时间等信息,就可以确定用户的身份和权限,无需与其他服务器节点进行复杂的会话信息同步和共享,大大简化了集群环境下的身份验证和授权流程,提高了系统的整体性能和可扩展性。
五、JWT 的缺点
(一)令牌有效期管理挑战
一旦 JWT 令牌被签发,在其有效期内,如果用户的权限发生变化(如被撤销某些权限),由于令牌是自包含的且可能已经被分发到客户端或在网络中传播,很难即时使该令牌失效。例如,在一个企业内部管理系统中,如果某个员工被离职处理,但之前签发给他的 JWT 令牌仍然在有效期内,他可能仍然能够使用该令牌访问部分资源,直到令牌过期。
(二)令牌信息泄露风险
由于 JWT 令牌包含了用户信息和声明,如果令牌被泄露(如通过网络攻击、恶意软件窃取等方式),攻击者可以获取令牌中的信息,并且在令牌有效期内假冒用户身份进行非法操作。虽然令牌有签名机制,但如果攻击者获取了签名密钥,就可以伪造令牌,进一步扩大安全风险。例如,在一个在线支付系统中,如果 JWT 令牌被泄露,攻击者可能利用其中的用户身份信息进行虚假交易。
(三)依赖密钥安全性
JWT 的签名和验证依赖于密钥,如果密钥管理不善(如密钥存储在不安全的地方、密钥长度过短等),可能会导致整个身份验证和授权机制的安全性受到威胁。例如,使用简单的硬编码密钥或者将密钥存储在可公开访问的配置文件中,都可能被攻击者轻易获取并利用。
六、JWT 令牌泄露后的解决策略
(一)短期应对:令牌黑名单机制
一种常见的应对策略是建立令牌黑名单机制。当发现令牌泄露或者需要撤销某个令牌时,将该令牌添加到黑名单中。服务器在验证令牌时,除了检查令牌的签名、有效期等常规信息外,还会检查令牌是否在黑名单中。例如:
// 假设 blacklist 是存储黑名单令牌的数组
function verifyToken(token) {if (isTokenInBlacklist(token)) {return false;}// 进行常规的令牌验证步骤,如签名验证、过期时间检查等return true;
}
然而,这种方式在大规模应用中可能会面临性能和存储方面的挑战,因为需要不断地维护和查询黑名单列表。
(二)长期应对:重新签发令牌与加强安全措施
从长期来看,当发现令牌泄露事件后,应该及时通知用户重新登录,重新签发新的 JWT 令牌,并采取一系列加强安全措施,如:
- 加强密钥管理:使用更安全的密钥生成和存储方式,如使用密钥管理系统(KMS)来生成、存储和轮换密钥,定期更新密钥以降低密钥泄露的风险。
- 改进身份验证流程:增加多因素身份验证(MFA)机制,如在用户登录时除了密码之外,还要求输入短信验证码、指纹识别等额外的验证因素,提高用户身份验证的安全性。
- 监控与审计:建立完善的安全监控和审计系统,实时监测令牌的使用情况,及时发现异常的令牌活动,并进行审计分析,以便及时发现和应对潜在的安全威胁。
关于“IWT”,不太明确您所提及的具体内容,如果是笔误,可能是指“JWT”。如果是其他特定的技术或概念,请提供更多信息以便进一步探讨。
七、前端存储 JWT 的方式
(一)Cookie
可以将 JWT 令牌存储在 Cookie 中。Cookie 是一种传统的浏览器存储机制,它可以随着 HTTP 请求自动发送到服务器。例如,在服务器端设置 Cookie:
// 使用 Express.js 框架为例
const express = require('express');
const app = express();app.get('/login', (req, res) => {const token = generateJWTToken(); // 生成 JWT 令牌res.cookie('jwt_token', token, { httpOnly: true }); // 将令牌存储在名为 jwt_token 的 Cookie 中,并设置 httpOnly 属性res.send('Login successful');
});
设置 httpOnly
属性可以防止 JavaScript 脚本访问 Cookie,一定程度上提高安全性,但也限制了前端 JavaScript 对令牌的直接操作。
(二)LocalStorage
另一种常见的方式是使用浏览器的 LocalStorage。LocalStorage 提供了更大的存储容量,并且可以方便地被 JavaScript 访问和操作。例如:
// 在前端 JavaScript 中存储 JWT 令牌到 LocalStorage
const token = response.token; // 假设从服务器响应中获取到 JWT 令牌
localStorage.setItem('jwt_token', token);// 从 LocalStorage 中获取 JWT 令牌
const storedToken = localStorage.getItem('jwt_token');
然而,使用 LocalStorage 存储 JWT 令牌也存在风险,因为 JavaScript 可以直接访问 LocalStorage,如果应用存在跨站脚本攻击(XSS)漏洞,攻击者可能获取到令牌并进行恶意利用。
(三)SessionStorage
SessionStorage 与 LocalStorage 类似,但它存储的数据在浏览器会话结束时会被清除。例如:
// 存储 JWT 令牌到 SessionStorage
sessionStorage.setItem('jwt_token', token);// 从 SessionStorage 中获取 JWT 令牌
const storedToken = sessionStorage.getItem('jwt_token');
这种方式适用于一些只需要在当前会话中使用令牌的场景,如一次性的身份验证操作,但在多页面应用或需要持久化令牌的场景下可能不太适用。
在实际应用中,需要根据具体的安全需求和应用场景选择合适的前端存储方式,并结合其他安全措施(如防范 XSS 和跨站请求伪造 CSRF 攻击等)来确保 JWT 令牌的安全性。
JWT 令牌作为一种现代化的身份验证与授权解决方案,在带来诸多优势的同时,也面临着一些挑战和风险。开发者在使用 JWT 技术时,需要充分了解其原理、特点以及潜在的安全问题,并采取相应的措施来保障系统的安全性和可靠性。
相关文章:
JWT 令牌:原理、应用与安全考量
深入理解 JWT 令牌:原理、应用与安全考量 文章目录 深入理解 JWT 令牌:原理、应用与安全考量一、引言二、JWT 令牌与传统方式的区别(一)传统身份验证方式的特点与局限(二)JWT 令牌的优势 三、JWT 令牌的字段…...
YOLOv5+pyqt5+摄像头在特定条件下进行目标检测并采集原始数据
项目介绍 项目地址 GitHub - biabu0/Yolov5_D435i: 通过YOLOV5与pyqt5实现一个使用D435i深度摄像头采集特定需求与场景下的深度数据的小程序 通过YOLOV5对指定的区域进行检测,当检测到目标进入特定区域时,开始保存数据,摄像头采用D435i深度…...
12.6深度学习_模型优化和迁移_整体流程梳理
七、整体流程梳理 1. 引入使用的包 用到什么包,临时引入就可以,不用太担心。 import time import osimport numpy as np import pandas as pd import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvisio…...
TCP 和 UDP 可以使用同一个端口吗
TCP 和 UDP 可以使用同一个端口吗 简单来说 可以使用同一个端口,关键在于它们属于不同的传输层协议,在内核中是两个完全独立的软件模块,各自维护独立的端口空间,虽然端口号相同,但通过协议类型可以确定是哪种协议。 …...
信而泰网络测试仪校准解决方案
一、影响仪表精度的因素 网络测试仪是用于对数据网络及其相关设备性能参数进行测试的仪表,可以模拟网络终端产生流量,进行网络性能测试,对网络状态进行实时监测,分析和统计。数字计量对于精准数据的网络测试仪来说是一剂强心针&a…...
Java 实现给pdf文件指定位置盖章功能
Java 实现给pdf文件指定位置盖章功能 开发中遇到一个需求, 需要给用户上传的的pdf文件, 指定位置上盖公章的功能, 经过调研和对比, 最终确定实现思路. 这里是使用pdf文件中的关键字进行章子的定位, 之所以这样考虑是因为如果直接写死坐标的话, 可能会出现因pdf大小, 缩放, 盖章…...
机器学习支持向量机(SVM)算法
一、引言 在当今数据驱动的时代,机器学习算法在各个领域发挥着至关重要的作用。支持向量机(Support Vector Machine,SVM)作为一种强大的监督学习算法,以其在分类和回归任务中的卓越性能而备受瞩目。SVM 具有良好的泛化…...
解决 MySQL 启动失败与大小写问题,重置数据库
技术文档:解决 MySQL 启动失败与大小写问题,重置数据库 1. 问题背景 在使用 MySQL 时,可能遇到以下问题: MySQL 启动失败,日志显示 “permission denied” 或 “Can’t create directory” 错误。MySQL 在修改配置文…...
计算生成报价单小程序系统开发方案
计算生成报价单小程序报价系统,是根据商品品牌、类型、型号、规格、芯数、特性、颜色、分类进行选择不同的参数进行生成报价单,要求报价单支持生成图片、pdf、excel表格。 计算生成报价单小程序系统的主要功能模块有: 1、在线生成报价单&…...
若依集成Uflo2工作流引擎
文章目录 1. 创建子模块并添加依赖1.1 新建子模块 ruoyi-uflo1.2 引入 Uflo2 相关依赖 2. 配置相关 config2.1 配置 ServletConfig2.2 配置 UfloConfig2.3 配置 TestEnvironmentProvider 3. 引入Uflo配置文件4. 启动并访问 Uflo2 是由 BSTEK 自主研发的一款基于 Java 的轻量级工…...
STM32模拟I2C通讯的驱动程序
目录 STM32模拟I2C通讯的驱动程序 开发环境 引脚连接 驱动程序 STM32模拟I2C通讯的驱动程序 开发环境 立创天空星开发板、主控芯片为STM32F407VxT6 引脚连接 使用stm32的PB9引脚模拟I2C时钟线SCL、PB8引脚模拟I2C数据线SDA 驱动程序 i2c.h文件如下:#ifndef…...
Unity简单操作及使用教程
Unity 是一款强大的跨平台游戏引擎,它不仅支持 2D 和 3D 游戏的开发,还可以用于虚拟现实 (VR)、增强现实 (AR)、动画、建筑可视化等多个领域。Unity 提供了完整的开发环境,具有丰富的功能、工具和资源,可以帮助开发者快速实现创意…...
网络安全法-监测预警与应急处置
第五章 监测预警与应急处置 第五十一条 国家建立网络安全监测预警和信息通报制度。国家网信部门应当统筹协调有关部门加强网络安全信息收集、分析和通报工作,按照规定统一发布网络安全监测预警信息。 第五十二条 负责关键信息基础设施安全保护工作的部门…...
qt 设置系统缩放为150%,导致的文字和界面的问题
1 当我们设置好布局后,在100%的设置里面都是正常的,但是当我们修改缩放为150%后,字体图标,界面大小就出现问题了,这就需要我们设置一些参数。 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QCoreAppl…...
Scala的正则表达式二
验证用户名是否合法 规则 1.长度在6-12之间 2.不能数字开头 3.只能包含数字,大小写字母,下划线def main(args: Array[String]): Unit {val name1 "1admin"//不合法,是数字开头val name2 "admin123"//合法val name3 &quo…...
软考系分:今日成绩已出
前言 今年报考了11月份的软考高级:系统分析师。 考试时间:11月9日。 总体感觉偏简单,但是知识点记得不牢,估计机会不大。 今日 12.11 ,成绩已出,每科总分 75分,全部45分以上为通过。 成绩总…...
DevExpress WPF中文教程:Grid - 如何移动和调整列大小?(一)
DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...
Docker 安装 sentinel
Docker 安装系列 1、拉取 [rootTseng ~]# docker pull bladex/sentinel-dashboard Using default tag: latest latest: Pulling from bladex/sentinel-dashboard 4abcf2066143: Pull complete 1ec1e81da383: Pull complete 56bccb36a894: Pull complete 7cc80011dc6f: Pull…...
PyCharm 2024.1 解锁版 (Python集成开发IDE)详细安装步骤
分享文件:PyCharm 2024.1 解锁版 (Python集成开发IDE) 链接:https://pan.xunlei.com/s/VOAa_CiVVvZnyQgLfpmCIOABA1 提取码:cx4h 安装步骤 1、下载解压后点击如下进行安装 2、选择安装路径 3、默认勾选将PyCharm创建桌面快捷方式 4、默认…...
SQL中的函数介绍
大多数SQL实现支持以下类型 文本函数:用于处理文本字符串(如删除或填充值,转换值为大写或小写)。数值函数:用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)。日期和时间函…...
【工业机器视觉】基于深度学习的水表盘读数识别(2-数据采集与增强)
【工业机器视觉】基于深度学习的仪表盘识读(1)-CSDN博客 数据采集与增强 为了训练出适应多种表型和环境条件的模型,确保数据集的质量与多样性对于模型的成功至关重要。高质量的数据不仅需要准确无误、具有代表性,还需要涵盖尽可能…...
爬虫基础知识点
最近看了看爬虫相关知识点,做了记录,具体代码放到了仓库,本文仅学习使用,如有违规请联系博主删除。 这个流程图是我使用在线AI工具infography生成的,这个网站可以根据url或者文本等数据自动生成流程图,挺…...
高效利用资源:分布式有状态服务的高可靠性设计
在分布式系统设计中,实现有状态服务的高可靠性通常采用主备切换的方式。当主服务停止工作时,备服务接管任务,例如通过Keepalive实现VIP的切换以保证可用性。然而,这种方式存在资源浪费的问题,因为备服务始终处于空转状…...
aws(学习笔记第十六课) 使用负载均衡器(ELB)解耦webserver以及输出ELB的日志到S3
aws(学习笔记第十六课) 使用负载均衡器(ELB)以及输出ELB的日志到S3 学习内容: 使用负载均衡器(ELB)解耦web server输出ELB的日志到S3 1. 使用负载均衡器(ELB) 全体架构 使用ELB(Elastic Load Balancer)能够解耦外部internet访问和web server之间的耦合,…...
关于php://filter过滤器
常规的php://filter过滤器: <?php //index.php include($_REQUEST[file]); ?> <?php //flag.php $flagflag{test_flag}; ?> 同过base64读取flag.php的类容: 常用payload: (这是最常用的payload) ph…...
数据安全法-政务数据安全与开放
第五章 政务数据安全与开放 第三十七条 国家大力推进电子政务建设,提高政务数据的科学性、准确性、时效性,提升运用数据服务经济社会发展的能力。 第三十八条 国家机关为履行法定职责的需要收集、使用数据,应当在其履行法定职责的范围内依…...
MySQL数据库的数据类型
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 MySQL数据库的数据类型 收录于专栏[MySQL] 本专栏旨在分享学习MySQL的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 数据类型分类 …...
前端H5移动端基础框架模板 :Vue3 + Vite5 + Pinia + Vant4 + Sass + 附源码
技术栈选用 Vue3 Vite5 Pinia Vant4 Sass 源码地址: git clone https://gitee.com/gaiya001/h5-APP.git1. 1.vite.config.js文件配置 ** import { defineConfig } from vite // 导入 Vite 的配置函数 import vue from vitejs/plugin-vue // 导入 Vue 插件 i…...
什么是线程安全
🌈🌈🌈今天给大家分享的是:什么是线程安全 目录 线程安全的定义 线程安全的级别 (1)不可变 (2)绝对线程安全 (3)相对线程安全 (4)线程非安全…...
️️️ 避坑指南:如何修复国密gmssl 库填充问题并提炼优秀加密实践20241212
🛡️ 避坑指南:如何修复国密gmssl 库填充问题并提炼优秀加密实践 ✨ 引言 在当下的数据安全环境中,SM4作为中国国家密码算法的代表性选择,被广泛应用于金融、通信和政府领域。然而,在实际开发中,即便是开…...
wordpress模板二次元/必应搜索引擎怎么样
1 /** 2 * author 陈维斌 3 * 如果想将日期字符串格式化,需先将其转换为日期类型Date 4 * 以下是提供几种常用的 5 * 6 * var da new Date().format(yyyy-MM-dd hh:mm:ss); //将日期格式串,转换成先要的格式 7 * alert("格式化日期类型 \n" new Date() "\n 为…...
php做企业网站管理系统/海外营销推广
tencent://message/?uin53928716&Sitepotisoft&Menuyes转载于:https://www.cnblogs.com/Impulse/archive/2011/08/16/2140792.html...
建设网站 万网/竞价推广开户多少钱
一沙一世界,一树一菩提,我们这个世界的深邃全部蕴藏于一个个普通的平凡当中。小小的厨房所容纳的不仅仅是人们对味道的情感,更有推动整个世界前进的动力。要想理解我们的世界,有的时候只需要细细品味一下我们所喜爱的美食即可。正…...
天津b2b网站建设公司价格/免费域名申请
一、 MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数。一般只需要直接写到sql语句后面就行了。LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如果给出两个参数, 第一个参数指定…...
商务网站建设一万字/深圳网站建设三把火科技
运算符用于在程序运行时执行数学或逻辑运算。 Go语言内置的运算符有: 算术运算符关系运算符逻辑运算符位运算符赋值运算符其他运算符算术运算符 算术运算符主要有:、-、*、/、%(求余)、(自增)、--ÿ…...
做网站要商标吗/网站优化平台
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文件名称:数据库应用—手动创建(SQLite)数据库--手动创建数据表(table) * 作 者&#…...