记python实现RSA加密登录

项目测试中发现登录的账号密码表单是明文传输的,开发修复了之后,接口脚本因为要用到Cookies,又不想手动去复制Cookies,就只能吧公钥拿出来自己实现登录了

一、分析加密过程

查看网页源码

可以看到这里登录方法直接写在源码里面了,下面直接看看登录做了什么操作

查看登录实现过程

得出下面几个信息:

  1. 登录接口/api/account/login
  2. 登录的json为:{‘ciphertext’: ciphertext}
    a. ciphertext是rsaEncryption(loginInfo)的返回值
    b. logininfo是一个类似于json的字符串 (可能还想对密码进行加密之后再处理的,又被注释掉了)
{
    "account": this.form.account,
    // password: Base64.encode(this.form.password)
    "password": this.form.password
}
  1. rsaEncryption很显然就是个rsa的加密方法了,看下具体的实现
    果然就是JSEncrypt设置完公钥之后把上面的logininfo串直接加密,然后又做了一次Base64加密

既然知道了过程,并且也拿到了公钥,就开始撸码吧!

二、开始撸码

  1. 网上找了python实现rsa加密的库Crypto,但是下载不下来,查了资料才知道
pip install pycryptodome
  1. 下载下来之后到site-packages中把crypto的首字母大写,改为Crypto
  2. 下面就是实现过程
import base64
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5
from Crypto.PublicKey import RSA

def _encrpt(string, public_key):
    rsakey = RSA.importKey(public_key)  # 读取公钥
    cipher = Cipher_pksc1_v1_5.new(rsakey)
    # 因为encryptor.encrypt方法其内部就实现了加密再次Base64加密的过程,所以这里实际是通过下面的1和2完成了JSEncrypt的加密方法
    encrypt_text = cipher.encrypt(string.encode())  # 1.对账号密码组成的字符串加密
    cipher_text_tmp = base64.b64encode(encrypt_text)  # 2.对加密后的字符串base64加密
    # 源码除了encryptor.encrypt加密外,又一次对密文进行了Base64加密,所以我们这里也再次加密
    cipher_text = base64.b64encode(cipher_text_tmp)  
    return cipher_text.decode()


def gen_body(account, pwd, public_key=None):
    '''根据账号密码生成请求的body然后调用_encrpt方法加密'''
    if not public_key: public_key = 'MIGfMA0GxxxxxxxxxxEBAQUAA4GNADCBiQKBgQCFa8mE++++++++++hMrwZ7KORiOnNCVbtb7Rcnjw9Pxxxx++xxabG6QL0G2++++xxxx++JH6Q8zEQNfZ9THbFhW+BqH920D+++++++++++kG0ZCwE0jrIcxbGCZVH3OBuSZNH++++xxxx++WX1NHHDDMwSOS3PqFJ+BVOmlzeH2QIDAQAB'
    key = '-----BEGIN PUBLIC KEY-----\n' + public_key + '\n-----END PUBLIC KEY-----'
    encrypt_res = _encrpt("{'account': '%s','password':'%s'}" % (account, pwd), key)
    return {'ciphertext': encrypt_res}

因为是为了给我的接口调用,所以这里写了gen_body方法,支持账号、密码、公钥自定义传参,不必过度关注。所以本质上python实现JSEncrypt的加密方法过程其实就是:

import base64
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5
from Crypto.PublicKey import RSA


def encrpt(string):
    public_key = 'MIGfMA0GxxxxxxxxxxEBAQUAA4GNADCBiQKBgQCFa8mE++++++++++hMrwZ7KORiOnNCVbtb7Rcnjw9Pxxxx++xxabG6QL0G2++++xxxx++JH6Q8zEQNfZ9THbFhW+BqH920D+++++++++++kG0ZCwE0jrIcxbGCZVH3OBuSZNH++++xxxx++WX1NHHDDMwSOS3PqFJ+BVOmlzeH2QIDAQAB'
    key = '-----BEGIN PUBLIC KEY-----\n' + public_key + '\n-----END PUBLIC KEY-----'
    rsakey = RSA.importKey(key)
    cipher = Cipher_pksc1_v1_5.new(rsakey)
    encrypt_text = cipher.encrypt(string.encode())
    cipher_text = base64.b64encode(encrypt_text)
    return cipher_text.decode()
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值