python aes 128 gcm 防沉迷身份认证
python aes 128 gcm
最近防沉迷的api用到aes 128 gcm
python 3版本
import json
from Crypto.Cipher import AES
import base64
import requests
import hashlib
import time
import os
import binasciiURL = "https://wlc.nppa.gov.cn/test/authentication/check"
KEY = "d10d8642c66c1c785aa32b194aba2afa"
APPID = "9177929f5010481b858f661a409fd764"
BIZID = "1101999999"TEST_PARAMS = {"ai":"100000000000000001",
"name":"某一一",
"idNum":"110000190101010001"}class AES_GCM(object):def __init__(self, key):self.key = key #秘钥self.MODE = AES.MODE_GCMself.iv = os.urandom(12)def aes_encrypt(self, params):aes = AES.new(binascii.unhexlify(self.key), self.MODE, self.iv)params, tag=aes.encrypt_and_digest(json.dumps(params).encode("utf-8"))base64_data= self.iv + params + tagencrypted_text = str(base64.b64encode(base64_data), encoding='utf-8')return encrypted_textdef aes_decrypt(self, encrypted_text):encrypted_text = base64.b64decode(encrypted_text)cipher = AES.new(binascii.unhexlify(self.key), self.MODE, encrypted_text[:12])cc = cipher.decrypt_and_verify(encrypted_text[12:-16], encrypted_text[-16:])return json.loads(cc)def hash256(pre_hash_text):hs256 = hashlib.sha256() hs256.update(pre_hash_text.encode()) return hs256.hexdigest() def sorted_params(params, param_="%s%s", none_keys = []):return "".join([param_ % i for i insorted(params.items(), key=lambda d:d[0]) if i[0] not in none_keys]) def main():aesobject = AES_GCM(KEY)aes_gcm = aesobject.aes_encrypt(TEST_PARAMS)body_data='{"data":"%s"}' % aes_gcm ## 国家游戏防沉迷的api试了不能进行json.dumps()_time = str(int(time.time()*1000)) ## 加入请求头报文headers = {"Content-Type":"application/json; charset=utf-8","appId":APPID,"bizId":BIZID,"timestamps":_time}## 对请求头报文排序并排除 不必要的字段进行字符串拼接params_str = sorted_params(headers, none_keys=["Content-Type"])headers["sign"] = hash256("".join([KEY, params_str, body_data]))# print(aesobject.aes_decrypt(aes_gcm)) ## 解码response = requests.post(URL, headers=headers, data= body_data)print(response.json())if __name__ == '__main__':main()
兼容python3和python2 版本
因个别老系统可能还在使用python2进行维护,出个兼容版本
#coding:utf8
"""安装 cryptography 支持2.7+ and 3.4+ 建议在linux在调试 """
import sys
import os
import base64
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import (
Cipher, algorithms, modes
)
import binasciiPY2 = sys.version_info[0] == 2
if PY2:reload(sys)sys.setdefaultencoding("utf8") ## 在python2一定要加上,否则会出现编码问题def encrypt(key, plaintext):"""加密"""iv = os.urandom(12)encryptor = Cipher(algorithms.AES(binascii.unhexlify(key)),modes.GCM(iv),backend=default_backend()).encryptor()plaintext = encryptor.update(plaintext)finalize = encryptor.finalize() ## tag = encryptor.tagciphertext =iv + plaintext+ finalize + tag return base64.b64encode(ciphertext)def decrypt(key, ciphertext):"""解密"""ciphertext = base64.b64decode(ciphertext)decryptor = Cipher(algorithms.AES(binascii.unhexlify(key)),modes.GCM(ciphertext[:12], ciphertext[-16:]),).decryptor()return decryptor.update(ciphertext[12:-16]) + decryptor.finalize()
if __name__ =='__main__':key = "d10d8642c66c1c785aa32b194aba2afa"data = '{"ai":"100000000000000001","name":"某一一","idNum":"110000190101010001"}'ciphertext = encrypt(key, data.encode("utf8")) ## print(ciphertext)print(decrypt(key, ciphertext))
查询是否认证示例代码
#coding:utf8import requests
import hashlib
import timeurl = "https://wlc.nppa.gov.cn/test/authentication/query?ai=100000000000000001"key = "d10d8642c66c1c785aa32b194aba2afa"def sorted_params(params, param_="%s%s", none_keys = []):return "".join([param_ % i for i insorted(params.items(), key=lambda d:d[0]) if i[0] not in none_keys])
def hash256(pre_hash_text):hs256 = hashlib.sha256() hs256.update(pre_hash_text.encode()) return hs256.hexdigest()_time = str(int(time.time()*1000))headers = {"Content-Type":"application/json; charset=utf-8","ai":"100000000000000001",
"appId":"9177929f5010481b858f661a409fd764","bizId":"1101999999","timestamps":_time}_str = sorted_params(headers, none_keys=["Content-Type"])
_str =key+_str ## 加密的key要放在最前面sign = hash256(_str)
headers["sign"] = sign
headers.pop("ai", None) ## 最好去掉,不去掉也目前也是可以的response = requests.get(url, headers=headers)print(response.json())
返回结果示例,已认证会有pi值返回
{'errcode': 0, 'errmsg': 'OK', 'data': {'result': {'status': 0, 'pi': '1fffbjzos82bs9cnyj1dna7d6d29zg4esnh99u'}}}
python aes 128 gcm 防沉迷身份认证相关推荐
- Python渗透测试编程技术--------身份认证攻击(一)
Python渗透测试编程技术 身份认证攻击 目前最为常见的身份验证模式采用的仍然是"用户名+密码"的方式,用户自行设定密码在登录时如果输入正确的密码,计算机就会认为操作者是合法用户 ...
- python的requests快速上手、高级用法和身份认证
https://blog.csdn.net/qq_25134989/article/details/78800209 快速上手 迫不及待了吗?本页内容为如何入门 Requests 提供了很好的指引.其 ...
- Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储
原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...
- Python+OpenCv实现AI人脸识别身份认证系统(1)——人脸识别原理
原 Python+OpenCv实现AI人脸识别身份认证系统(1)--人脸识别原理 置顶 2019年07月02日 08:47:40 不脱发的程序猿 阅读数 1255更多 所属专栏: 人脸识别身份认证系统 ...
- python http 身份认证简介
目录 授权方式简介 1. Basic Authentication 2. OAuth 3. Token Authentication 4. Digest Authentication(重点说一下) 代 ...
- “人生苦短,我用Python“——身份认证攻击
身份认证攻击 身份认证攻击 简单网络服务认证攻击 FTP暴力破解模块 SSH暴力破解模块 Web暴力破解模块 身份认证攻击 目前最常见的身份认证模式采用的仍然是"用户名+密码"的方 ...
- 基于Python实现的SKey身份认证协议
资源下载地址:https://download.csdn.net/download/sheziqiong/85621996 SKey 身份认证协议的代码实现 本项目为课程实验内容,简单模拟了通过S/K ...
- Python+OpenCV实现AI人脸识别身份认证系统(4)—人脸识别
本篇博文是Python+OpenCV实现AI人脸识别身份认证系统的收官之作,在人脸识别原理到数据采集.存储和训练识别模型基础上,实现人脸识别,废话少说,上效果图: 案例引入 在Python+OpenC ...
- Python+OpenCv实现AI人脸识别身份认证系统(3)——训练人脸识别模型
目录 案例引入 本节项目 最近有小伙伴们一直在催本项目的进度,好吧,今晚熬夜加班编写,在上一节中,实现了人脸数据的采集,在本节中将对采集的人脸数据进行训练,生成识别模型. 案例引入 首先简要讲解数据集 ...
最新文章
- linux 的一个防火墙策略
- 图文解释XCode常用快捷键的使用
- Could not find destination factory for transport解决方法
- 计算机硬件价钱分配,电脑基础知识计算机硬件基础课件.ppt
- AT2005-[AGC003E]Sequential operations on Sequence【差分,思维】
- AT2300-[ARC068C]Snuke Line【整除分块】
- jsf 传参数_在JSF 2中对定制验证器进行参数化
- 征途pak文件修改_传奇技能,第十四祭:装备属性修改与增加新装备
- 一文搞懂C语言回调函数
- Linux开启服务器问题(李蕾问题)
- java ini_java读取ini格式的文件
- Oracle如何实现跨库查询
- freeswith 录制 MP4格式视频
- Python纯代码pdf批量快速转换成ppt
- 使用 WinRAR 将bat转exe
- 图像处理之图像直方图
- iPhone, iPad 安装 ipa 文件
- python列表(list)
- B站向快视频发律师函;2017年网络直播用户4.22亿;委内瑞拉预售“石油币”丨价值早报
- mysql 输入法表情数据,mysql 5.7 版本输入法表情符问题-----java解决办法
热门文章
- unity单例模式两种_Unity和GameAnalytics合作起来! Roadhouse Interactive通过两种工具分享他们的经验
- inkscape转换svg为pdf
- linux安装方舟编译器,华为方舟编译器安装 软件源码地址,华为方舟编译器安装 软件源码地址预约 - 浏览器家园...
- 纵深防御体系_纵深防守
- struts2-类型转换器
- [Python爬虫] 二、爬虫原理之定义、分类、流程与编码格式
- 类型多样的摩托车 三轮车cc0高清摄影图片素材,速来收藏
- 基于php签到考勤系统的设计
- 解决笔记本win7系统玩游戏不能全屏办法
- 画论12 张彦远《历代名画记》