关键词搜索

源码搜索 ×
×

Python 使用rsa类库基于RSA256算法生成JWT

发布2021-08-31浏览794次

详情内容

JWT简介

JWT(Json web token),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。JWT提供了一种简单、安全的身份认证方法,特别适合分布式站点单点登录、或者是签名。

JWT构成

JWT是由3部分信息组成,分别为headerpayloadsignature,组合形式为:header.payload.signature(注意:这里的headerpayloadsignature都是经过base64加密的值)

格式如下:

  1. {
  2. 'typ': 'JWT', # 声明类型
  3. 'alg': 'RS256' # 声明加密算法 # RSA Signature withSHA-256
  4. }

要构成JWT组成部分之前,需要对其进行base64加密,得到一字符串,形如:eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJSUzI1NiJ9

payload

payload用于存放有效信息,可划分为三部分。

  • 标准声明

  • 公共声明

  • 私有声明

标准声明(建议但不强制使用)

  • iss:issue,JWT签发者

  • sub:subject,主题

  • aud:audience,受众,该JWT所面向的用户

  • exp JWT过期时间戳,单位秒,这个过期时间必须要大于签发时间

  • nbf:定义在什么时间之前,该JWT都是不可用的

  • iatJWT签发时间

  • jtiJWT的唯一身份标识,主要用来作为一次性token,从而避免重放攻击。

公共声明

公共声明可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。一般不建议添加敏感信息,因为该部分在客户端可解密。

私有声明

私有声明是提供者和消费者所共同定义的声明,一般不建议添加敏感信息,因为该部分在客户端也是可解密。

格式如下

  1. {
  2. "iss":"shouke",
  3. "sub":"test_subject",
  4. "aud":"tester",
  5. "iat":1624499492,
  6. "exp":1624535491,
  7. "jti":"8NLazrgnXpAvmHA6eybETH7RT8sUWbag",
  8. "username":"shouke",
  9. "hobby":"unknow"
  10. }

header一样,要构成JWT组成部分之前,需要对其 python教程进行base64加密,得到一字符串,形如:

eyJpc3MiOiAiY2Fzc21hbGwuY29tIiwgInN1YiI6ICJtYW5keSIsICJhdWQiOiAiY2Fzc21hbGwiLCAiaWF0IjogMTYyNTI4NzIzNSwgImV4cCI6IDE2NTY4MjMyMzUsICJqdGkiOiAiSmVRbUxqUlpaR0hjVEh1ZE5FdWRiUyIsICJ1c2VybmFtZSI6ICJzaG91a2UiLCAiaG9iYnkiOiAidW5rbm93In0=

signature

headerpayload构成了signature基础信息,格式为:header.payload,其中headerpayload,也是base64加密后的值。

构成JWT组成部分之前,需要采用headeralg配置对应的算法,对上述基础信息进行加密,然后对加密结果进行base64编码,得到最终的signature

L1THOR4+gsksnDzwjGDsVCjvwlO7NBRdC6cVHAy1pycUGBugE6UM6mj/So1QRivVOyzk/OafHg9KpsR3/93SJ4SJXIyYhLaJXfIH+6tvi9Z72h6A2ko2AT//gfdtAtTJEMAF8rlsuu58FgYSQn2GjCIgn8oRNyX5S4w5Zmz+cJk=

最后,将以上三部分用.连接起来,得到JWT,如下

eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJSUzI1NiJ9.eyJpc3MiOiAiY2Fzc21hbGwuY29tIiwgInN1YiI6ICJtYW5keSIsICJhdWQiOiAiY2Fzc21hbGwiLCAiaWF0IjogMTYyNTI4NzIzNSwgImV4cCI6IDE2NTY4MjMyMzUsICJqdGkiOiAiSmVRbUxqUlpaR0hjVEh1ZE5FdWRiUyIsICJ1c2VybmFtZSI6ICJzaG91a2UiLCAiaG9iYnkiOiAidW5rbm93In0=.L1THOR4+gsksnDzwjGDsVCjvwlO7NBRdC6cVHAy1pycUGBugE6UM6mj/So1QRivVOyzk/OafHg9KpsR3/93SJ4SJXIyYhLaJXfIH+6tvi9Z72h6A2ko2AT//gfdtAtTJEMAF8rlsuu58FgYSQn2GjCIgn8oRNyX5S4w5Zmz+cJk=

代码实现

  1. import rsa
  2. import base64
  3. import json
  4. import shortuuid
  5. from datetime import datetime, timedelta
  6. def make_jwt():
  7. header = { 'typ': 'JWT', # 令牌类型
  8. 'alg': 'RS256' # 使用的算法 # RSA Signature withSHA-256
  9. }
  10. header = base64.b64encode(json.dumps(header).encode()).decode() # encode decode 默认使用utf-8
  11. print(header)
  12. payload = {
  13. "iss":"cassmall.com",
  14. "sub":"mandy",
  15. "aud":"cassmall",
  16. "iat":int(datetime.now().timestamp()),
  17. "exp":int((datetime.now()+ timedelta(seconds=31536000)).timestamp()), # JWT过期时间戳,单位秒
  18. "jti":shortuuid.uuid(),
  19. "username":"shouke",
  20. "hobby":"unknow"
  21. }
  22. payload = base64.b64encode(json.dumps(payload).encode()).decode()
  23. print(payload)
  24. signature = genrate_signature(1024, '{header}.{payload}'.format(header=header, payload=payload).encode('utf-8'), 'SHA-256')
  25. print(signature)
  26. return '{header}.{payload}.{signature}'.format(header=header,
  27. payload=payload,
  28. signature=signature)
  29. def genrate_signature(nbits, message, hash_method):
  30. (pubkey, privkey) = rsa.newkeys(nbits)
  31. if not isinstance(message, bytes):
  32. message = message.encode('utf-8')
  33. hash = rsa.compute_hash(message, hash_method)
  34. return base64.b64encode(rsa.sign(hash, privkey, hash_method)).decode()
  35. if __name__ == '__main__':
  36. print(make_jwt())

作者:授客
本文版权归原作者所有,仅供学习参考之用,转载请注明出处:,未经作者允许请务必保留此段声明!


作者:授客

Git地址:https://gitee.com/ishouke

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载