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插入到网络中,并与网络中的其他应用程序进行通信.网 ...
随机推荐
- linux环境下安装python 3
说明: 在linux环境下,都默认安装python 2的环境,由于python3在python2的基础上升级较大,所以安装python 3环境用于使用最新的python 3的语法. 安装过程: 1.下 ...
- vmare_mac 关闭完整性检查
今天在vmware 15 安装mac10.13,安装之后不能全屏,查了很多资料最后完美解决 首先我们需要进入mac的恢复模式 等待出现苹果LOGO,直到进度条加载完毕 然后打开实用工具-终端 关闭SI ...
- Flask 上传下载文件
上传文件示例代码 #encoding:utf8 from werkzeug.utils import secure_filename from flask import Flask,render_te ...
- linux 结束某个进程,并且结束子进程
pid=49184 childid=`ps -ef|grep $pid|grep -v grep|awk '{printf " %s",$2 }'` kill -9 $childi ...
- C++ 右值引用与move
C++ 右值引用与move 右值引用 C++中所有的值都必然属于左值.右值二者之一.左值是指表达式结束后依然存在的持久化对象,右值是指表达式结束时就不再存在的临时对象. 所有的具名变量或者对象都是左值 ...
- Oracle树形结构查询(递归)
引用:https://blog.csdn.net/u012615705/article/details/78321022 文章转自上述地址,内部有稍许改动,如有需要请查看原文. oracle树状结构 ...
- 构建一个java环境的centos系统镜像并上传到阿里云镜像仓库
编辑dockerfile 文件 FROM centos MAINTAINER zhaoweifeng ENV LANG en_US.UTF-8 RUN /bin/cp /usr/share/zonei ...
- [UE4] TSharedPtr, TWeakObjectPtr and TUniquePtr
转自:https://dawnarc.com/2018/07/ue4-tsharedptr-tweakobjectptr-and-tuniqueptr/ UE4 的 TSharedPtr.TWeakO ...
- 视频质量诊断----PTZ云台运动检测
一.PTZ云台运动检测是通过配合云台运动的功能检测云台运动是否正常. 二.原理 取云台运动前N帧图像,进行背景建模,得到运动前背景A. 设备发送云台运动指令,让云台进行运动,改变场景. 取云台运动后N ...
- 【jquery】【jqGrid】设置不能多选
onSelectAll:function(rowids,statue){ layui.layer.msg("请选择单条记录"); $("#jqGrid").jq ...