开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 464|回复: 2
收起左侧

[求助] 大佬们有没有易语言做的RS256算法的jwt签名例子?

[复制链接]
结帖率:100% (5/5)
发表于 2023-7-17 14:14:23 | 显示全部楼层 |阅读模式   四川省南充市
大佬们有没有易语言做的RS256算法的jwt签名例子?找了几天没找到
结帖率:100% (9/9)
发表于 2023-7-18 02:09:55 | 显示全部楼层   澳门特别行政区*
JWT简介
JWT(Json web token),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。JWT提供了一种简单、安全的身份认证方法,特别适合分布式站点单点登录、或者是签名。

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

header
格式如下:

{
  '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都是不可用的

iat:JWT签发时间

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

公共声明

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

私有声明

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

格式如下

{
    "iss":"shouke",
    "sub":"test_subject",  
    "aud":"tester",   
    "iat":1624499492,
    "exp":1624535491,
    "jti":"8NLazrgnXpAvmHA6eybETH7RT8sUWbag",   
    "username":"shouke",
    "hobby":"unknow"
}
同header一样,要构成JWT组成部分之前,需要对其 python教程进行base64加密,得到一字符串,形如:

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

构成JWT组成部分之前,需要采用header中alg配置对应的算法,对上述基础信息进行加密,然后对加密结果进行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())
回复 支持 反对

使用道具 举报

结帖率:40% (2/5)
发表于 2024-5-7 16:52:05 | 显示全部楼层   四川省德阳市
时间都必须转换成时间戳吗?
回复 支持 反对

使用道具 举报

  高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表