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. Java13新特性 -- 文本块

    在JDK 12中引入了Raw String Literals特性,但在发布之前就放弃了.这个JEP与引入多行字符串文字(text block) 在意义上是类似的. 这条新特性跟 Kotlin 里的文本 ...

  2. 解决support包引起的AndroidStudio编译报错

    {"kind":"error","text":"error: resource android:attr/colorError n ...

  3. Hive、Inceptor数据倾斜详解及解决

    一.倾斜造成的原因 正常的数据分布理论上都是倾斜的,就是我们所说的20-80原理:80%的财富集中在20%的人手中, 80%的用户只使用20%的功能 , 20%的用户贡献了80%的访问量. 俗话是,一 ...

  4. Anaconda + PyCharm + Pytorch

    Anaconda 1.  下载Anaconda https://www.anaconda.com/download/ 2.  安装 3. 添加环境变量 Path - C:\Users\Godzilla ...

  5. [Golang] ETCD键值监听器

    0x0 需求 我们所有的服务启动后都以lease形式注册入ETCD,现要把这些服务监控起来. 0x1 ETCD key监听器实现 可动态增删要监听的键值对 https://github.com/bai ...

  6. git之github配置

    1.安装好git以后,我们配置git秘钥,首先输入下面的命令: 2.接着上述操作,一路回车按键.如图所示:生成了秘钥,, 如下图,就是秘钥了: 3.我们打开注册好的github地址.找到ssh选项,将 ...

  7. 金钱数友好显示 php版本

    2019年6月28日16:35:10 此方法可扩展性较好 /* * 吧金额数字转成可视化的方便读的汉字表述 */ function amountConversion(float $amount = 0 ...

  8. 细说RESTful API之文档管理

    目录 API文档格式 文档管理方式 基于注解实现,代码和文档在一起 Swagger Api2Doc 基于API测试工具生成 Postman rest-client 独立编写文档 RAP DOCleve ...

  9. 解决org.springframework.web.multipart.MaxUploadSizeExceededException

    今天在spring boot2X 里做文件上传遇到了如下错误 org.springframework.web.multipart.MaxUploadSizeExceededException: Max ...

  10. activiti学习2:示例工程activiti-explorer.war的使用

    目录 activiti学习2:示例工程activiti-explorer.war的使用 一.搭建开发环境 二.运行示例工程 三.示例工程功能演示 1. 创建流程图 2. 部署流程图 3. 启动流程 4 ...