zoukankan      html  css  js  c++  java
  • Python 使用rsa类库基于RSA256算法生成JWT

    JWT简介

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

    JWT构成

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

    格式如下:

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

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

    payload

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

    • 标准声明

    • 公共声明

    • 私有声明

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

    • iss:issue,JWT签发者

    • sub:subject,主题

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

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

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

    • iatJWT签发时间

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

    公共声明

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

    私有声明

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

    格式如下

    {
        "iss":"shouke", 
        "sub":"test_subject",  
        "aud":"tester",    
        "iat":1624499492,
        "exp":1624535491, 
        "jti":"8NLazrgnXpAvmHA6eybETH7RT8sUWbag",   
        "username":"shouke",
        "hobby":"unknow"
    }
    

    header一样,要构成JWT组成部分之前,需要对其进行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=
    

    代码实现

    import rsa
    
    import base64
    import json
    import shortuuid
    from datetime import datetime, timedelta
    def make_jwt():
        header = { 'typ': 'JWT',  # 令牌类型
                   'alg': 'RS256' # 使用的算法 # RSA Signature withSHA-256
                 }
    
        header = base64.b64encode(json.dumps(header).encode()).decode() # encode  decode 默认使用utf-8
        print(header)
        payload = {
            "iss":"cassmall.com",
            "sub":"mandy",
            "aud":"cassmall",
            "iat":int(datetime.now().timestamp()),
            "exp":int((datetime.now()+ timedelta(seconds=31536000)).timestamp()), # JWT过期时间戳,单位秒
            "jti":shortuuid.uuid(),
            "username":"shouke",
            "hobby":"unknow"
        }
        payload = base64.b64encode(json.dumps(payload).encode()).decode()
        print(payload)
        signature = genrate_signature(1024, '{header}.{payload}'.format(header=header, payload=payload).encode('utf-8'), 'SHA-256')
        print(signature)
    
        return '{header}.{payload}.{signature}'.format(header=header,
                                                          payload=payload,
                                                          signature=signature)
    
    
    def genrate_signature(nbits, message, hash_method):
        (pubkey, privkey) = rsa.newkeys(nbits)
        if not isinstance(message, bytes):
            message = message.encode('utf-8')
        hash = rsa.compute_hash(message, hash_method)
        return base64.b64encode(rsa.sign(hash, privkey, hash_method)).decode()
    
    
    if __name__ == '__main__':
        print(make_jwt())
    

    作者:授客
    公众号:授客的知识库
    QQ:1033553122
    全国软件测试QQ交流群:7156436

    Git地址:https://gitee.com/ishouke
    友情提示:限于时间仓促,文中可能存在错误,欢迎指正、评论!
    作者五行缺钱,如果觉得文章对您有帮助,请扫描下边的二维码打赏作者,金额随意,您的支持将是我继续创作的源动力,打赏后如有任何疑问,请联系我!!!
                微信打赏                       支付宝打赏                        授课的知识库               全国软件测试交流QQ群  
                          

  • 相关阅读:
    server-conf-PPTConf
    client-autoReport-ppt
    client-autoReport-common
    浏览器书签导出
    微信公众号JSAPI支付-多公众号向同一商户号支付的问题解决
    Kettle 4.4.0 通过 Java 代码 输出日志到表
    spring tx:advice事务配置
    Spring异常捕获而且回滚事务的方法
    移动端服务器i-jetty下载编译安装及问题解决系列
    I-Jetty部署war包到安卓手机
  • 原文地址:https://www.cnblogs.com/shouke/p/14969107.html
Copyright © 2011-2022 走看看