模拟一个http 请求的json格式报文,带 rsa 签名操作
一、对需要加密的字符串,定义RsaSignUnsign 类,代码如下:
实现了:
1、实现了生成新的pubkey、pri_key方法;
2、将新生成的keys 写入文件;
3、从文件获取pubkey、pri_key
4、对传入的字符串进行签名,转为bytes类型串,签名,转为base64串,再转为str 串
5、对传入的字符串验签,传入字符串转为bytes串,解base64格式,与原字符串的bytes格式进行验签
#coding=utf-8
'''
rsa字符串签名
''' import rsa
import traceback
import base64 class RsaSignUnsign():
def __init__(self): self.pubkey=None
self.pri_key=None def get_newkeys(self,n=1024):
self.pubkey,self.pri_key=rsa.newkeys(n)
return self.pubkey,self.pri_key def get_keys(self):
if self.pubkey != None and self.pri_key != None:
return self.pubkey,self.pri_key
return None #如果路径未输入,会在当前路径生成pubkey.pem、pri_key.pem
def write_keytofile(self,pubkey_path='pubkey.pem',pri_key_path='pri_key.pem'): with open(pubkey_path,'w',encoding='utf-8')as fp:
fp.write(self.pubkey.save_pkcs1().decode('utf-8')) with open(pri_key_path,'w',encoding='utf-8')as fp:
fp.write(self.pri_key.save_pkcs1().decode('utf-8')) def load_keys(self,pubkey_path='pubkey.pem',pri_key_path='pri_key.pem',encode_format='utf-8'): try:
fp=open(pubkey_path,'r',encoding=encode_format)
fp.readline() fp1=open(pri_key_path,'r',encoding=encode_format)
fp1.readline()
except:
traceback.print_exc()
else:
fp.seek(0.0)
self.pubkey=rsa.PublicKey.load_pkcs1(fp.read().encode())
fp.close()
fp1.seek(0.0)
self.pri_key=rsa.PrivateKey.load_pkcs1(fp1.read().encode())
fp1.close() return self.pubkey,self.pri_key def rsa_str_sign(self,s_str,sign_type='SHA-1'):
if not isinstance(s_str,str):
return None s_sign=rsa.sign(s_str.encode('utf-8'),self.pri_key,sign_type)
s_b64=base64.b64encode(s_sign).decode('utf-8')
#print('s_b64:',s_b64) return s_b64 #s_str 是加密后转码base64 再decode为str类型;s为原str未签名串
def rsa_str_verify(self,s_str,s):
if not isinstance(s_str,str):
return None s_b64=s_str.encode('utf-8')
s_unsign=base64.b64decode(s_b64) try:
result=rsa.verify(s.encode('utf-8'),s_unsign,self.pubkey)
return result
except:
print('验签失败:')
traceback.print_exc() if __name__=='__main__':
r=RsaSignUnsign()
pubkey,prikey=r.get_newkeys(1024)
#print('pubkey:',pubkey)
#print('prikey:',prikey) r.write_keytofile('e:\\pubkey.pem','e:\\pri_key.pem') r.load_keys('e:\\pubkey.pem','e:\\pri_key.pem')
print(r.get_keys())
print('*'*30) s='nihaoma'
ss=r.rsa_str_sign(s)
print('ss:',ss) #s='nihaoma1'
print('#'*20)
print(r.rsa_str_verify(ss,s))
二、主程序请求报文,对格式字符串进行拼串,签名操作
#coding=utf-8
'''
模拟一个http的json格式请求报文
'''
from rsa_str import *
import json d_header={'typeCode':'onlineCoupon',
'version':1.0}
couponUseDateList=["", "", ""]
d_body={'promotionPlanId':10001,
"faceValue": '%.2f'%5.00,
"couponUseDateList":couponUseDateList}
signature='' d={'header':d_header,'body':d_body} for i in sorted(d_header):
signature+=str(d_header[i]) for i in sorted(d_body): if isinstance(d_body[i],list):
signature+=''.join(d_body[i])
else:
signature+=str(d_body[i])
print('signature:',signature) rsasign=RsaSignUnsign()
rsasign.load_keys('e:\\pubkey.pem','e:\\pri_key.pem') signature=rsasign.rsa_str_sign(signature) d['signature']=signature d_json=json.dumps(d) print('d_json:',d_json)
模拟一个http 请求的json格式报文,带 rsa 签名操作的更多相关文章
- SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析
SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析 一:问题demo展示 ...
- 如何模拟一个http请求并把response的内容保存下载下来,导出到excel中(结尾福利)
def doExport(self): # 模拟一个http请求 url = u'%s?dumptype=investigation&dumpid=%s&timezone=8' % ( ...
- 修复一个mysqlbinlog_flashback不支持json格式问题
修复一个mysqlbinlog_flashback不支持json格式问题 , 有问题可以反馈留言 , 如下盘: 最简单的例子为 python mysqlbinlog_back.py --host=&q ...
- Springmvc 的post请求的json格式参数
背景: 这两天在项目中遇到了一个问题.我的环境是springmvc4.1.9,写了几个可以用ajax请求的接口(ajax.jsonp 调用正常).突然一时兴起就用 HTTP 请求的工具(比如火狐浏览器 ...
- 使用jQuery发送POST,Ajax请求返回JSON格式数据
问题: 使用jQuery POST提交数据到PHP文件, PHP返回的json_encode后的数组数据,但jQuery接收到的数据不能解析为JSON对象,而是字符串{"code" ...
- springmvc通过ajax异步请求返回json格式数据
jsp 首先创建index.jsp页面 <script type="text/javascript"> $(function () { $("#usernam ...
- get请求传递json格式数据的两种方法
get请求参数为json格式数据,使用pyhton+request的两种实现方式如下: 方法一:使用requests.request() 示例代码如下: 1.导入requests和json impor ...
- JAVA发送POST请求携带JSON格式字符串参数
import org.apache.commons.lang.StringUtils; import org.apache.http.HttpEntity; import org.apache.htt ...
- 【问题记录】LoadRunner 接口压测-json格式报文
[问题起因] 前段时间,协助其他项目录制接口压测脚本,对方要求请求报文内容实现参数化. 请求方法如下: 直接在Parameter List中新增一个parameter, 将请求报文放入dat文件中.这 ...
随机推荐
- luoguP1058:立体图 (真的不是娱乐向_(:з」∠)_)
题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每 ...
- Selenium问题集锦
此文章用于记录使用Selenium遇见的问题~ 问题1:sendkeys直接报错如下: 解决方案:selenium 驱动和Chrome浏览器的版本必须对应,不然会报此错.驱动地址:点此跳转 下载前先看 ...
- 消息中间件——RocketMQ(一) 环境搭建(完整版)
每章一点正能量:每当你想要放弃的时候,就想想是为了什么才一路坚持到现在. 前言 最近在回顾复习Java基础中的一些知识点,发现了一些以前见过但是没有留意却特别有意思的知识特性,比如这次想分享的Java ...
- BFC的作用及其应用
简单介绍BFC BFC 就是块级格式化上下文,是页面盒模型布局中的一种 CSS 渲染模式,相当于一个独立的容器,里面的元素和外部的元素相互不影响. 创建 BFC 的方式有: 1.html的根元素 2. ...
- 模块 time 和 datetime
目录 时间模块time datatime time 模块 datetime 模块 时间模块time datatime time 模块 在Python中,通常有这三种方式来表示时间:时间戳.元组(str ...
- 『Linux』第一节: 部署虚拟环境
一. 准备工具 1. VMware Workstation Pro下载 1.1 VMware Workstation Pro 激活许可证 UY758-0RXEQ-M81WP-8ZM7Z-Y3HDA V ...
- base全家桶的安装使用方法
base编码是Binary-to-text encoding的一种实现方法,它可以把二进制数据(含不可打印的字符)编码成可打印字符序列. 本文会不定时收录“base全家桶”:base64.base32 ...
- codeforce 839d.winter is here
题意:如果一个子序列的GCD为1,那么这个子序列的价值为0,否则子序列价值为子序列长度*子序列GCD 给出n个数,求这n个数所有子序列的价值和 题解:首先得想到去处理量比较少的数据的贡献,这里处理每个 ...
- (一)Redis之简介和windows下安装radis
一.简介 1.1 关于nosql 介绍Redis之前,先了解下NoSQL (Not noly SQL)不仅仅是SQL, 属于非关系型数据库:Redis就属于非关系型数据库, 传统的Mysql ,ora ...
- LeetCode 754. Reach a Number
754. Reach a Number(到达终点数字) 链接:https://leetcode-cn.com/problems/reach-a-number/ 题目: 在一根无限长的数轴上,你站在0的 ...