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

yipeiwu_com5年前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设计】网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

在Django的form中使用CSS进行设计的方法

修改form的显示的最快捷的方式是使用CSS。 尤其是错误列表,可以增强视觉效果。自动生成的错误列表精确的使用`` <ul class=”errorlist”>``,这样,我...

python实现删除列表中某个元素的3种方法

python中关于删除list中的某个元素,一般有三种方法:remove、pop、del: 1.remove: 删除单个元素,删除首个符合条件的元素,按值删除 举例说明: >...

和孩子一起学习python之变量命名规则

变量命名规则 下面是关于变量名(也称为标识符)的一些规则 必须以一个字母或一个下划线字符开头。后面可以使用一个字母、数字或下划线字符的序列,长度不限。 字母可以是大写或小写,大小写...

python实现读取excel写入mysql的小工具详解

Python是数据分析的强大利器 利用Python做数据分析,第一步就是学习如何读取日常工作中产生各种excel报表并存入数据中,方便后续数据处理。 这里向大家分享python如何读取...

python虚拟环境virtualenv的安装与使用

同一台服务器上部署多个项目时,项目可能使用不同版本的django或者其它不同的python库,这种情况下可以使用virtualenv来创建独立的python运行环境,将不同项目的运行环境...