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插入到网络中,并与网络中的其他应用程序进行通信.网 ...
随机推荐
- nanopi的ds18b20温度传感器测试
参考(抄袭)资料在这里 先接线,3.3v,gnd,数据输出脚,我是PG11 vim /boot/armbianEnv.txt overlays=w1-gpio param_w1_pin=PG11 pa ...
- Qt 一张图片显示在其他组件之上
图片放在QLabel上,注意设置QLable一些属性 QImage img("test.png"); img = img.scaledToWidth(,Qt::SmoothTran ...
- iredmail开源邮件系统部署
Iredmail 安装前注意事项: 通过官网了解iRedMail: 2. 选择相应的linux发行版(我选的是64位的CentOS6.4,iRedMail-0.8.6.tar.bz2) ired ...
- chrome 报错 ERR_CERT_AUTHORITY_INVALID
场景: 本地调试https/wss程序,使用了openssl自签名的证书,解决方法:添加到信任证书 根据以下图片流程操作 然后 打开selfsigned.cer 清空该网站缓存 参考资料: https ...
- Python正则简单实例分析
Python正则简单实例分析 本文实例讲述了Python正则简单用法.分享给大家供大家参考,具体如下: 悄悄打入公司内部UED的一个Python爱好者小众群,前两天一位牛人发了条消息: 小的测试题: ...
- 理解CNN中的感受野(receptive-field)
1. 阅读论文:Understanding the Effective Receptive Field in Deep Convolutional Neural Networks 理解感受野 定义:r ...
- Zabbix使用第三方API短信报警
之前试过邮件告警,微信告警.但是,对于一些企业的重要业务服务器,可能是存放在隔离的内网中的,无法正常连接外网.这个时候,就有必要考虑一下使用短信告警.以下这个其实还是需要服务器能够连接到外网的,但是我 ...
- [LeetCode] 929. Unique Email Addresses 唯一的电邮地址
Every email consists of a local name and a domain name, separated by the @ sign. For example, in ali ...
- Linux 中的-rwxr-xr-x权限代表什么意思
Linux 中的权限 这里我拿一个tomcat目录举例说明.首先我们在linux系统中执行命令:ls -l 我们拿出其中一个说明-rwxr-xr-x,在Linux 系统中权限是区分用户的,即用户.组用 ...
- [Arch] 域名解析常用两步设置
主站 A 记录 (对应IPv4) 主机记录: @ (表示解析到不带 www 主域名) 值为 IP 主站 CNAME 记录 (表示别名) 主机记录: www (表示解析到带 ...