首页 > 其他分享 >RSA非对称加密和开放鉴权

RSA非对称加密和开放鉴权

时间:2024-04-06 19:11:19浏览次数:16  
标签:base64 RSA pub sign token key msg 非对称 鉴权

#导入base64模块来进行base64编码
import base64
import rsa
import time
class HandleSign:
    # 定义服务器公钥, 往往可以存放在公钥文件中,通过抓包获取
    server_pub = """
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQENQujkLfZfc5Tu9Z1LprzedE
    O3F7gs+7bzrgPsMl29LemonPYvIG8C604CprLittlenJpnhWu2lGirlWZyLq6sBr
    tuPorOc42+gInFfyhJAwdZB6Sqlove7bW+jNe5youDtU7very6Gx+muchGo8Dg+S
    kKlZFc8Br7SHtbL2tQIDAQAB
    -----END PUBLIC KEY-----
    """
    @classmethod
    def to_encrypt(cls, msg, pub_key=None):
        """
        非对称加密
        :param msg: 待加密字符串或者字节
        :param pub_key: 公钥
        :return: base64密文字符串
      请求参数:{"key1":"value1","key2":"value2"} + 字段时间戳 + token前50位 通过公钥去解密
        加密后拿到一个字符:w9cVcJvpx8+dgqKnEUgaim
        {"key1":"value1","key2":"value2","sign": "w9cVcJvpx8+dgqKnEUgaim"}
        """
        if isinstance(msg, str):  # 如果msg为字符串, 则转化为字节类型
            msg = msg.encode('utf-8')
        elif isinstance(msg, bytes):  # 如果msg为字节类型, 则无需处理
            pass
        else:  # 否则抛出异常
            raise TypeError('msg必须为字符串或者字节类型!')
        if not pub_key:  # 如果pub_key为空, 则使用全局公钥
            pub_key = cls.server_pub.encode("utf-8")
        elif isinstance(pub_key, str):  # 如果pub_key为字符串, 则转化为字节类型
            pub_key = pub_key.encode('utf-8')
        elif isinstance(pub_key, bytes):  # 如果msg为字节类型, 则无需处理
            pass
        else:  # 否则抛出异常
            raise TypeError('pub_key必须为None、字符串或者字节类型!')
        public_key_obj = rsa.PublicKey.load_pkcs1_openssl_pem(pub_key)  # 创建 PublicKey 对象
        # 2.创建 PublicKey 对象
        # public_key_obj = rsa.PublicKey.load_pkcs1(pub_key)
        cryto_msg = rsa.encrypt(msg, public_key_obj)  # 生成加密文本
        cipher_base64 = base64.b64encode(cryto_msg)  # 将加密文本转化为 base64 编码
        result = cipher_base64.decode()  # 将字节类型的 base64 编码转化为字符串类型
        return result
    @classmethod
    def generate_sign(cls, token):
        """
        生成sign,对外使用
        :param timestamp:当前秒级时间戳,为int类型
        :param token: token,为str类型
        :return: 时间戳和sign组成的字典
        """
        timestamp = int(time.time())  # 获取当前的时间戳
        print(timestamp)
        prefix_50_token = token[:50]  # 获取token前50位
        message = prefix_50_token + str(timestamp)  # 将token前50位与时间戳字符串进行拼接
        sign = cls.to_encrypt(message)  # 生成sign
        return {"timestamp": timestamp, "sign": sign}
if __name__ == '__main__':
    # 数据传递加密场景:待加密字符串或者字节
    love_talk = "admin@123"
    # 1.用自己生成的publickye测试下
    # lemon_pub,lemon_priv=rsa.newkeys(512)
    # lemon_pub2=lemon_pub.save_pkcs1()
    # print(lemon_pub2)
    # 调用to_encrypt类方法来进行加密
    cryto_info = HandleSign.to_encrypt(msg=love_talk)
    print(cryto_info)
    # 开放鉴权场景:请求入参中中加入sign字段,拿到新的请求参数发送请求
    sign = HandleSign.generate_sign(token="fb432a51-a252-410b")
    print(sign)

 

标签:base64,RSA,pub,sign,token,key,msg,非对称,鉴权
From: https://www.cnblogs.com/python-test001/p/18117777

相关文章

  • linux - GPG 非对称加密工具
    GNUPrivacyGuard(GPG)是一种主要设计用于使用公钥加密技术对数据进行加密和签名的工具。然而,它还包含仅使用用户提供的密码来加密数据的能力,并且支持多种加密算法。1.查看gpg支持的算法gpg--version2.生成密钥#使用默认选择gpg--generate-key#更灵活的算法选择g......
  • 华为ENSP SSH使用RSA密钥交换进行远程登录实验
    实验拓扑:实验流程:1、AR1模拟客户端,AR2模拟远程登录服务器1、AR2开启SSH服务,配置AAA本地用户2、交换AR1和AR2的host主机密钥3、实现AR1远程登录AR2实验配置:先配置AR1和AR2的IP地址[AR1]intGigabitEthernet0/0/0[AR1-GigabitEthernet0/0/0]ipadd192.168.1.124[A......
  • 【图像加密】基于RSA实现灰色、彩色图像加密解密(含秘钥)附Matlab代码
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 云原生最佳实践系列 6:MSE 云原生网关使用 JWT 进行认证鉴权
    方案概述MSE网关可以为后端服务提供转发路由能力,在此基础上,一些敏感的后端服务需要特定认证授权的用户才能够访问。MSE云原生网关致力于提供给云上用户体系化的安全解决方案,其中JWT认证能力是在JsonWebToken这种结构化令牌的基础上实现了一套基于用户体系对用户的API(服......
  • 某xx冰城app-sha256withrsa分析
    现在的天气是真的越来越暖和,太容易口渴了,索性拿出裤兜的几块钱买杯凉饮喝喝吧!那不说来就来了。今天分析的app是6Jyc6Zuq5Yaw5Z+OYXBwLXYxLjIuMA==,安装包百度一下即可。1.先抓个包没错,今天要分析的是这个"sign"字段,"t"是一个时间戳,所以每次请求加密肯定都是变化的。2.......
  • The 2023 ICPC Asia Jinan Regional Contest (The 2nd Universal Cup. Stage 17: Jina
    The2023ICPCAsiaJinanRegionalContest(The2ndUniversalCup.Stage17:Jinan)D.LargestDigit题意:给定两个范围la,ra,lb,rb,求在两个范围内选任意两个数相加,求最大的数位思路:暴力枚举即可,遇到9跳出循环voidsolve(){llla,ra,lb,rb;cin>>la>>r......
  • RSA进阶(一)
    本篇为RSA进阶篇,继RSA入门[RSA3]P1(扩展欧几里得)题目fromCrypto.Util.numberimport*flag=b'******'m1=bytes_to_long(flag[:len(flag)//2])m2=bytes_to_long(flag[len(flag)//2:])assert18608629446895353521310408885845687520013234781800558*m1-142588104721......
  • 解决ubuntu22.04的ssh问题--userauth_pubkey: key type ssh-rsa not in PubkeyAccepte
    问题在我新安装了一台ubuntu22.04的服务器时,配置远程服务器正常情况下,只要把握本机的公钥写到被远程主机对应用户的.ssh/authorized_keys文件中就好了但是,今天发现,虽然设置进去了,但是远程还是提示需要密码但是并不是所有的主机是这样的,同样是ubuntu22.04的服务器还是能够免......
  • 动态判断是否需要Api接口鉴权
    一.概述问题:在使用asp.netcoreapi做业务开发时,在本地vs开发环境,部署后的测试环境,都需要先获取access_token,才能访问api接口,这样浪费了调试与测试时间。    现状:我这里是通过Apollo配置中心定义了二套配置环境,一是Dev环境:用于本地vs开发环境,部......
  • buuctf childRSA wp
    题目如下点击查看代码fromrandomimportchoicefromCrypto.Util.numberimportisPrime,sieve_baseasprimesfromflagimportflagdefgetPrime(bits):whileTrue:n=2whilen.bit_length()<bits:n*=choice(primes)......