JWT与Token详解

前言:JWT全称“JSON Web Token”,是实现Token的机制。官网:https://jwt.io/

JWT的应用

  1. JWT用于登录身份验证。
  2. 用户登录成功后,后端通过JWT机制生成一个token,返回给客户端。
  3. 客户端后续的每次请求都需要携带token,携带在authorization中。
  4. 后端从authorization中拿到token后,通过secretKey进行解密验证身份。

Token的组成原理

JWT生成的Token由三部分组成:header.payload.signature

  • header

    • alg:指定signature采用的加密算法,默认是HS256,对称加密(加密和解密的密钥相同)
    • typ:固定值,通常是JWT
    • 通过base64Url算法进行编码
  • payload

    • 用户id和name
    • 默认携带iat,令牌签发时间(时间戳)
    • exp设置令牌过期时间
    • 通过base64Url算法进行编码
  • signature

    • 设置一个secretKey,通过将前两个结果合并后进行HS256算法
    • signature的组成:HS256(baseUrl64(header)+'.'+baseUrl(payload)+','+secretKey)
    • secreKey一定不能暴露,因为可以颁发token,也可以解密
采用HS256对称加密生成的Token(https://jwt.io/)

在这里插入图片描述

JWT对称加密

JWT默认使用的是HS256对称加密,其中secretKey是密钥,意味着公钥和私钥都是同一个,这样安全性不高。

例如在分布式服务中,其他系统服务器虽然可以用secretKey验证token,但是这样不安全,因为采用的是对称加密算法,每个服务器都可以通secretKey颁发token,黑客只要攻破任何一个服务器就可以拿到secretKey。

在这里插入图片描述

JWT非对称加密

所以我们需要使用非对称加密,加密和解密的密钥不一致。加密密钥称为“私钥”,解密密钥称为“公钥”。
在这里插入图片描述

采用RS256非对称加密生成的Token(https://jwt.io/)

在这里插入图片描述

生成私钥和公钥

mac电脑直接使用终端

windows电脑安装git,使用git bash终端。

  • 输入openssl
  • 输入genrsa -out private.key 2048生成私钥
  • 输入rsa -in private.key -pubout -out public.key生成公钥

代码中加密使用的算法需要修改为RS256非对称加密算法(注意:RS256最小密钥大小为2048位)

nodejs中实现JWT(token非对称加密)

const Koa = require('koa')
const KoaRouter = require('@koa/router')
const jwt = require('jsonwebtoken');
const fs = require('fs')

const app = new Koa();
const loginRouter = new KoaRouter({ prefix: '/login' })
const usersRouter = new KoaRouter({ prefix: '/users' })

const privateKey = fs.readFileSync('./keys/private.key')
const publicKey = fs.readFileSync('./keys/public.key')
// login接口
loginRouter.post('/', (ctx, next) => {
  const payload = { id: 1, name: 'zjc' }
  const token = jwt.sign(payload, privateKey, {
    expiresIn: 3000,
    algorithm: 'RS256'
  })
  ctx.body = {
    message: '登录成功',
    code: 200,
    token
  }
})
// users接口
usersRouter.get('/', (ctx, next) => {
  const token = ctx.header.authorization.replace('Bearer ', '')
  console.log(token);
  try {
    // 验证token
    jwt.verify(token, publicKey)
    ctx.body = {
      code: 200,
      data: ['xx', 'yy']
    }
  } catch (error) {
    ctx.body = {
      code: -1001,
      message: 'token无效'
    }
  }

})

app.use(loginRouter.routes())
app.use(usersRouter.routes())
app.listen(8000, () => {
  console.log('服务器启动成功');
})
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JWT(JSON Web Token)是一种用于身份验证的开放标准(RFC 7519)。它通过数字签名验证消息的完整性,因此,JWT可以安全地传输信息JWT通常用于Web应用程序中,以验证用户的身份。 生成JWT token的步骤如下: 1. 首先,需要选择一个加密算法,如HMAC SHA256或RSA。 2. 构建JWT token的header部分。header部分是一个JSON对象,它描述了JWT的类型和加密算法。例如: ``` { "alg": "HS256", "typ": "JWT" } ``` 其中,"alg"表示使用的加密算法,"typ"表示JWT的类型。 3. 构建JWT token的payload部分。payload部分也是一个JSON对象,它包含要传输的信息,例如用户ID、用户名、过期时间等。例如: ``` { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } ``` 其中,"sub"表示主题(通常是用户ID),"name"表示用户名,"iat"表示JWT的发布时间。 4. 使用密钥对header部分和payload部分进行签名。签名可以确保消息的完整性和真实性。签名的方法取决于所选择的加密算法。例如,如果使用HMAC SHA256,签名可以如下计算: ``` HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret) ``` 其中,"secret"是一个密钥,用于计算签名。 5. 将header部分、payload部分和签名组合在一起,用"点"连接起来,形成JWT token。例如: ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIy. SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` 其中,第一个部分是base64UrlEncode后的header部分,第二个部分是base64UrlEncode后的payload部分,第三个部分是签名。 因为JWT token包含签名,所以接收方可以验证它的完整性和真实性。如果签名验证失败,说明该消息可能已被篡改或伪造。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值