【jwt】

HMAC-SHA256

是一种通过特别计算方式之后产生的消息认证码使用散列算法同时结合一个加密密钥。它可以用来保证数据的完整性,同时可以用来作某个消息的身份验证


import hmac

key = b''
string = b''
h = hmac.new(key, string, digestmod=hashlib.sha256)
h.digest()

JWT-校验jwt规则

  1. 确认alg解析header
  2. 签名校验-根据传过来的header和payload按 alg 指明的算法进行签名,将签名结果和传过来的sign进行对比,若对比一致,则校验通过。
  3. 获取payload自定义内容
# 安装pyjwt,而不是jwt
pip install pyjwt -i https://pypi.tuna.tsinghua.edu.cn/simple/

JWT的三部分

生成的token由三部分组成,以.分隔

import jwt
import time
import base64


def make_token(username, expire=3600 * 24):
    key = '123456'
    now_t = time.time()
    payload_data = {
        'username': username,
        'exp': now_t + expire
    }
    return jwt.encode(payload_data, key, algorithm='HS256')


def unmake_token(token):
    key = '123456'
    return jwt.decode(token, key, algorithms=['HS256'])


token = make_token('poppy')
print(f'token:{token},{type(token)}')
# 第一部分,头信息,注明使用的算法、类型等信息,采用base64生成
headers = token.split('.')[0]
headers = base64.b64decode(headers).decode('utf-8')
print(f'headers:{headers},{type(headers)}')

# 第二部分,payload,需要加密的信息,通常包括用户信息等,采用base64生成
payload = token.split('.')[1]
payload = base64.b64decode(payload).decode('utf-8')
print(f'payload:{payload},{type(payload)}')

# 第三部分是对第一、二部分经过加密后得到的
# --------------------------------------------

# 如果第三部分经过解密以后与第一、二部分符合,则token有效,返回加密的内容
ori_string = unmake_token(token)
print(f'ori_string:{ori_string},{type(ori_string)}')


token:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InBvcHB5IiwiZXhwIjoxNzA2NTkyNDA3LjgzNTA3NjZ9.GwJa7CLxE1N7-S7COWCgut4AHE_NTTM9rS4XvRqPVDk,<class 'str'>
headers:{"alg":"HS256","typ":"JWT"},<class 'str'>
payload:{"username":"poppy","exp":1706592407.8350766},<class 'str'>
ori_string:{'username': 'poppy', 'exp': 1706592407.8350766},<class 'dict'>
### JSON Web Token (JWT) 概述 JSON Web Token(JWT)是一种开放标准(RFC 7519),旨在作为各方之间安全传输信息的方式。这种紧凑且自包含的令牌允许在主体(通常是用户)和服务器间传递声明,这些声明通常经过数字化签名来确保其真实性[^1]。 ### 使用场景 #### 授权 授权是JWT最普遍的应用之一,尤其适用于解决单点登录(Single Sign-On, SSO)的问题。由于JWT具有无状态特性——即服务端无需保存会话信息,这使得它非常适合于现代Web应用和服务架构中的身份验证需求[^2]。 #### 信息交换 除了用于认证外,JWT还常用来实现在不同系统间的可靠数据共享。通过利用加密技术对Token进行签名,接收方可确认发送者的合法性以及所携带的信息未经篡改。因此,在微服务环境中或第三方API调用时采用JWT能提供一种高效而安全的消息传递机制。 ### 实现方式 创建一个典型的JWT涉及三个部分:头部(Header)、载荷(Payload) 和 签名(Signature): - **Header**: 包含类型(`typ`)与使用的算法名称(`alg`), 如HMAC SHA256 或 RSA。 - **Payload**: 承载着实际要传达的数据,称为Claims。它们可以是非敏感性质的内容,比如用户名或其他公开属性。 - **Signature**: 是基于前面两个组件计算得出的结果,目的是为了防止任何人修改已发出的token内容。具体来说就是将编码后的header和payload连同密钥一起按照指定算法处理得到最终字符串[^4]。 ```json { "alg": "HS256", "typ": "JWT" } . { "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } . SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` 上述示例展示了如何构建一个完整的JWT实例,其中包含了必要的组成部分并进行了适当格式化以便于理解和使用。 ### 安全性 安全性对于任何涉及到个人信息保护的技术都至关重要。针对这一点,JWT提供了强大的防护措施以抵御潜在威胁。通过对Header和Payload实施数字签名,不仅能够检验消息的真实性还能保证其完整性不受破坏。即使有人试图中途拦截并对内容做手脚也无法绕过这一层校验屏障。 此外值得注意的是,在某些情况下可能会选择HTTPS协议下的POST请求体内放置JWT而非直接附加到HTTP头字段中,以此增强通信的安全等级[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值