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模块的更多相关文章

  1. Python学习日记(三十四) Mysql数据库篇 二

    外键(Foreign Key) 如果今天有一张表上面有很多职务的信息 我们可以通过使用外键的方式去将两张表产生关联 这样的好处能够节省空间,比方说你今天的职务名称很长,在一张表中就要重复的去写这个职务 ...

  2. Python学习(三十二)—— Django之视图系统

    转载自:http://www.cnblogs.com/liwenzhou/articles/8305104.html Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Pyth ...

  3. Python学习日记(三十六) Mysql数据库篇 四

    MySQL作业分析 五张表的增删改查: 完成所有表的关系创建 创建教师表(tid为这张表教师ID,tname为这张表教师的姓名) create table teacherTable( tid int ...

  4. Python学习日记(四十二) Mysql数据库篇 十

    前言 当我们自己去写SQL代码的时候有时候会因为不熟练会导致效率低,再之后要进行许多的优化,并且操作也较为繁琐.因此ORM框架就能够解决上面的问题,它能根据自身的一些规则来帮助开发者去生成SQL代码. ...

  5. Python学习札记(三十二) 面向对象编程 Object Oriented Program 3

    参考:访问限制 NOTE 1.eg. #!/usr/bin/env python3 class Student(object): """docstring for Stu ...

  6. Python学习日记(三十八) Mysql数据库篇 六

    Mysql视图 假设执行100条SQL语句时,里面都存在一条相同的语句,那我们可以把这条语句单独拿出来变成一个'临时表',也就是视图可以用来查询. 创建视图: CREATE VIEW passtvie ...

  7. Python学习日记(三十九) Mysql数据库篇 七

    Mysql函数 高级函数 1.BIN(N) 返回N的二进制编码 ); 执行结果: 2.BINARY(str) 将字符串str转换为二进制字符串 select BINARY('ASCII'); 执行结果 ...

  8. Python学习日记(三十五) Mysql数据库篇 三

    使用Navicate 创建一个连接去使用Mysql的数据库,连接名可以取任意字符但是要有意义 新增一个数据库 填写新数据库名,设置它的字符集和排序规则 新建一个表 增加表中的信息 点击保存再去输入表名 ...

  9. Python学习日记(三十) Socket模块使用

    Socket(套接字) 套接字是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像文件一样的打开.读写和关闭等操作.套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信.网 ...

随机推荐

  1. PHP环境搭建-Windows系统下PHP环境搭建

    1.PHP环境搭建的前提是 Apache HTTP Server (Apache 服务器)已经安装部署成功,并可以正常访问到服务器的主页面.Apache HTTP Server 的安装部署已经在上一篇 ...

  2. Consider defining a bean of type 'com.*.*.mapper.*.*Mapper' in your configuration.

    @Mapper 不能加载的问题 Consider defining a bean of type 'com.*.*.mapper.*.*Mapper' in your configuration. 添 ...

  3. docker入门-基本概念(一)

    Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker的应用场景 Web 应用的自动化打包和发布. 自动化测试和持续集成.发 ...

  4. 在 Windows 中配置Maven

    访问http://maven.apache.org/ 点击左侧的导航栏,Download 跳转到下载maven的页面,往下滚动,看到 Files 处,选择apache-maven-3.3.9-bin- ...

  5. awk:for循环输出文件名

    简单来说,有file1.txt, file2.txt, file3.txt file1.txt如下: 1 a 4 d d g file2.txt如下: 2 b g 6 9 0 file3.txt如下: ...

  6. echo的色彩处理

    在Shell脚本中,可以使用echo的-e选项使显示内容呈现出不同的颜色. 格式1:echo -e "\033[背景颜色代码;文字颜色代码m 输出的字符串 \033[0m" 格式2 ...

  7. MyBatis的CRUD

    MyBatis的增删改查,特点是只要定义接口,不用实现方法,sql语句在xml中配置,非常方便 文件结构 接口UserDao import com.jinke.domain.QueryVo; impo ...

  8. (记录问题)1.Canvas.drawArc()方法的问题

    先看看异常: 一眼看去就知道说的是方法找不到错误 后面发现是系统版本过低,4.0的系统找不到5.0后添加的方法报的错. 修改后完美解决

  9. 学习 Git Rebase

    有问题为什么不问问神奇的 man 呢? rebase 也算是我比较常用的一个指令了,但是很长时间以来,对这个指令的认识还是不够深刻,于是就找了个时间认真地读了一下 git rebase 的文档.这份文 ...

  10. Docker---数据卷Volume的简单使用(使用DockerFile实现)

    DockerFile是什么?Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像.它们简化了从头到尾的流程并极大的简化了部署工作.Dockerfile从FR ...