Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)

yipeiwu_com7年前Python基础

环境:

Python3.7

依赖库:

import datetime
import random
import requests
import hashlib
import json
import base64
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from Crypto.Cipher import AES

加签:

def sign(signflag,keypath,baseRequest):
 #http请求body
  print(baseRequest)
  #加签标志
  if not signflag: return baseRequest
  else:
   #取请求体中的业务数据
    businessdata = json.dumps(baseRequest["data"])
    #读取私钥(.key格式,可使用openssl或java.keytools产生)
    with open(keypath,'r') as rsaKeyFile:
      rsaKey = rsaKeyFile.read().replace("\n",'')
      print(rsaKey)
    rsaKeyBytes = base64.b64decode(rsaKey)
    print(rsaKeyBytes)
    #SHA256摘要,RSA加密
    priKey = RSA.importKey(rsaKeyBytes)
    signer = PKCS1_v1_5.new(priKey)
    hash_obj = SHA256.new(business_data.encode('utf-8'))
    signature = base64.b64encode(signer.sign(hash_obj))
    print(signature)
    #把签名加进请求体并返回
    baseRequest['sign'] = signature.decode()
    print(baseRequest)
    return baseRequest

验签:

def validata(signflag,cerpath,res):
  if not signflag: return res
  else:
   #取业务数据和签名
    data = res['data']
    sign = res['sign']
    #此处cer已转换成pem格式,使用openssl工具
    #openssl x509 -inform der -pubkey -noout -in xxxxx.cer>xxxxx.pem
    cert = open(cerpath).read().replace("-----BEGIN PUBLIC KEY-----\n","").replace("-----END PUBLIC KEY-----\n","").replace("\n","")
    print(cert)
 #验签逻辑同加签
    pubBytes = base64.b64decode(cert)
    pubKey = RSA.importKey(pubBytes)
    signer = SHA256.new(json.dumps(data).encode("utf-8"))
    verifier = PKCS1_v1_5.new(pubKey)
    return verifier.verify(signer,base64.b64decode(sign))

总结

以上所述是小编给大家介绍的Python3.7基于hashlib和Crypto实现加签验签功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对【听图阁-专注于Python设计】网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

python接口自动化(十六)--参数关联接口后传(详解)

python接口自动化(十六)--参数关联接口后传(详解)

简介 大家对前边的自动化新建任务之后,接着对这个新建任务操作了解之后,希望带小伙伴进一步巩固胜利的果实,夯实基础。因此再在沙场实例演练一下博客园的相关接口。我们用自动化发随笔之后,要想接...

Django如何开发简单的查询接口详解

前言 Django处理json也是一把好手,有时候在工作中各个部门都会提供自己的相关接口,但是信息也只是单方的信息,这时候需要运维将各个部门的信息进行集成,统一出一个查询接口或页面,方便...

对Python 中矩阵或者数组相减的法则详解

对Python 中矩阵或者数组相减的法则详解

最近在做编程练习,发现有些结果的值与答案相差较大,通过分析比较得出结论,大概过程如下: 定义了一个计算损失的函数: def error(yhat,label): yhat = np...

使用Python脚本操作MongoDB的教程

连接数据库 MongoClient VS Connection class MongoClient(pymongo.common.BaseObject) | Connection...

Django的用户模块与权限系统的示例代码

一 导言 设计一个好的用户系统往往不是那么容易,Django提供的用户系统可以快速实现基本的功能,并可以在此基础上继续扩展以满足我们的需求。 先看看Django的用户系统都提供哪些功能...