Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块
Hmac模块
其实这个模块类似hashlib模块,它能将一些重要的信息通过算法加密成密文,让信息更具有安全性。
关于hmac加密算法的了解:它的全名是哈希运算消息认证码(Hash-based Message Authentication Code),HMAC利用hash算法,以一个消息M和一个秘钥K作为输入,生成一个定长的消息摘要作为输出。HMAC算法利用已有的hash函数,关键问题是如何使用秘钥。
使用
import hmac #这个模块和hashlib机制很相似
h = hmac.new(b'key',b'msg') #需要一个秘钥(bytes类型)和你想进行加密的bytes类型数据,前面为随机的key后面为一个消息
print(h.digest()) #结果拿到一个密文
#b'\x18\xe3T\x8cY\xad@\xdd\x03\x90{z\xee\xe7\x1dg'
检验客户端合法性
如何确定这个客户端是该服务器的合法客户端呢?如果两边实现都讲好了他们的秘钥就可以利用hmac.compare_digest()方法去比较他们最后产生的密文到底是不是相同的,如果是那就是合法的就进行相应的操作,若不合法就直接关闭。
这里介绍一个新的os模块方法urandom(32)
import os
print(os.urandom(32)) #随机生成32位的字节
#b'\xe2\x84:\x93\x82Q9\xff\x9e\x7f\x8a\x97)[\xedn\r\xa8\xf0v\x8b\xc0g\xbd\xe7\xeb\x0e\xa4\xf0\x80\x0c\x16'
利用这种'加盐'的方法我们就能让我们产生的秘钥具有不确定性,更加安全
检验合法的结果:
Sever:
import socket
import hmac
from os import urandom
secret_key = b'egg' #秘钥
sk = socket.socket()
sk.bind(('127.0.0.1',8090))
sk.listen() def check_conn(conn):
constant = urandom(32)
conn.send(constant)
h = hmac.new(secret_key,constant) #拿到一个密文对象
sever_digest = h.digest()
client_digest = conn.recv(1024)
return hmac.compare_digest(sever_digest,client_digest) conn,addr = sk.accept() res = check_conn(conn)
if res:
print('合法的客户端!') #合法的客户端!
#进行一系列操作
#conn.close()
pass
else:
print('不合法的客户端!')
conn.close()
sk.close()
Client:
import socket
import hmac secret_key = b'egg'
sk = socket.socket()
sk.connect(('127.0.0.1',8090))
msg = sk.recv(1024) h = hmac.new(secret_key,msg)
client_digest = h.digest()
sk.send(client_digest) sk.close()
那如果这个客户端它并不知道服务端的秘钥或者不知道服务端用的是HMAC进行的加密,那么它的结果很有可能是错误,给我们返回错误的客户端!
Socketsever模块
socketsever模块它能够实现多个客户端之间的交互
基本实现
Sever:
import socketserver
class Mysever(socketserver.BaseRequestHandler): #一般情况下带Base都是作为父类,Request即请求,Handler就是处理
def handle(self):
print(self.request.recv(1024).decode('utf-8')) #self.request相当于一个conn if __name__ == '__main__':
sever = socketserver.ThreadingTCPServer(('127.0.0.1',8080),Mysever) #Thread线程
#在一个程序里正常情况下只会有一个线程
#一个线程就是调度CPU的最小单位
#引入线程的概念去实现并发的效果
sever.serve_forever() #表示我永远启用一个服务
Client:
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
sk.send('hi'.encode('utf-8'))
sk.close()
Output:
hi
有socketsever的原因就是我想同时处理多个客户端找我下载的请求,那socketsever只是在底层的基础上做了一层封装,帮我们实现了并发效果,所以没有'clientsever'这个概念,客户端只需要正常启用就好
实现多个客户端交互
Sever:
import socketserver
class Mysever(socketserver.BaseRequestHandler):
def handle(self):
while True:
msg = self.request.recv(1024).decode('utf-8')
print(msg)
info = input('<<<').encode('utf-8')
self.request.send('Sever:'.encode('utf-8') + info)
if __name__ == '__main__':
sever = socketserver.ThreadingTCPServer(('127.0.0.1',8080),Mysever)
sever.serve_forever()
Client1:
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
msg = input('<<<').encode('utf-8')
sk.send('Client1:'.encode('utf-8') + msg)
print(sk.recv(1024).decode('utf-8'))
sk.close()
Client2:
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
msg = input('<<<').encode('utf-8')
sk.send('Client2:'.encode('utf-8') + msg)
print(sk.recv(1024).decode('utf-8'))
sk.close()
Output:



Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块的更多相关文章
- Python学习日记(三十四) Mysql数据库篇 二
外键(Foreign Key) 如果今天有一张表上面有很多职务的信息 我们可以通过使用外键的方式去将两张表产生关联 这样的好处能够节省空间,比方说你今天的职务名称很长,在一张表中就要重复的去写这个职务 ...
- Python学习(三十二)—— Django之视图系统
转载自:http://www.cnblogs.com/liwenzhou/articles/8305104.html Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Pyth ...
- Python学习日记(三十六) Mysql数据库篇 四
MySQL作业分析 五张表的增删改查: 完成所有表的关系创建 创建教师表(tid为这张表教师ID,tname为这张表教师的姓名) create table teacherTable( tid int ...
- Python学习日记(四十二) Mysql数据库篇 十
前言 当我们自己去写SQL代码的时候有时候会因为不熟练会导致效率低,再之后要进行许多的优化,并且操作也较为繁琐.因此ORM框架就能够解决上面的问题,它能根据自身的一些规则来帮助开发者去生成SQL代码. ...
- Python学习札记(三十二) 面向对象编程 Object Oriented Program 3
参考:访问限制 NOTE 1.eg. #!/usr/bin/env python3 class Student(object): """docstring for Stu ...
- Python学习日记(三十八) Mysql数据库篇 六
Mysql视图 假设执行100条SQL语句时,里面都存在一条相同的语句,那我们可以把这条语句单独拿出来变成一个'临时表',也就是视图可以用来查询. 创建视图: CREATE VIEW passtvie ...
- Python学习日记(三十九) Mysql数据库篇 七
Mysql函数 高级函数 1.BIN(N) 返回N的二进制编码 ); 执行结果: 2.BINARY(str) 将字符串str转换为二进制字符串 select BINARY('ASCII'); 执行结果 ...
- Python学习日记(三十五) Mysql数据库篇 三
使用Navicate 创建一个连接去使用Mysql的数据库,连接名可以取任意字符但是要有意义 新增一个数据库 填写新数据库名,设置它的字符集和排序规则 新建一个表 增加表中的信息 点击保存再去输入表名 ...
- Python学习日记(三十) Socket模块使用
Socket(套接字) 套接字是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网 ...
随机推荐
- ros 源码安装
版本lunar, 系统版本debian 9.8 参考: http://wiki.ros.org/lunar/Installation/Source 1. Installing bootstrap de ...
- Java分布式:分布式服务框架——ZooKeeper
Java分布式:ZooKeeper——核心概念 ZooKeeper 统一配置管理 统一命名服务 分布式锁
- 消息中间件 kafka rabbitmq 选型差异
https://www.zhihu.com/question/43557507 https://baijiahao.baidu.com/s?id=1610644333184173190&wfr ...
- SQL Server ---- 创建好的表修改不了字段
注意这个 是 sqlserver 2008 R2 当修改字段后出现来这个错误 解决方法 1.点击工具 选择选项 2.选择 designers 把阻止更改点掉就行了 建议,改好之后最 ...
- docker 学习总结
Docker 是一个容器工具,提供虚拟环境.解决了软件的环境配置和依赖问题,让软件可以带环境和依赖的安装. Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就会生成一个虚拟容 ...
- 如何将Prometheus仪表板添加到Grafana
Grafana是可视化的时间序列的基础设施和应用程序指标领先的图形和仪表盘构建的,但在许多其他领域,包括工业传感器,家庭自动化,天气和过程控制使用.它为您的团队和全世界提供了一种强大而优雅的方式来创建 ...
- 基于DigitalOcean+LAMP+WordPress搭建个人网站
1. 注册DigitalOcean并新建主机 为了搭建个人网站首先需要一个可以在公网范围访问的主机,可以选用国内如阿里云.国外如DigitalOcean的各种云主机提供商,这里选用DigitalOce ...
- setdefault函数的用法及理解
setdefault函数的用法及理解 dict.setdefault(key, default=None) 功能:如果键不存在于字典中,将会添加该键并将default的值设为该键的默认值,如果键存在于 ...
- 虚拟机CentOS创建/使用快照
快照 1.什么是快照 说的直白一点,就是创建一个备份.当执行了不可逆的错误操作后,可以通过快照用来恢复系统 2.创建快照的三种模式 挂载状态下创建快照 开机状态下创建快照 关机状态下创建快照 3.如何 ...
- Python如何获取系统大小端模式
1. 第一种方法导入sys模块: >>> import sys >>> >>> sys.byteorder 'little' >>&g ...