Python之路(第三十四篇) 网络编程:验证客户端合法性
一、验证客户端合法性
如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用hmac+加盐的方式来实现。
客户端验证的总的思路是将服务端随机产生的指定位数的字节发送到客户端,两边同时用hmac进行加密,然后对生成的密文进行比较,相同就是合法的客户端,不相同就是不合法的端户端。
示例代码
服务端
from socket import *
import hmac, os secret_key = b"nick" # 是指一个固定字符串的key def conn_auth(conn): # 定义函数认证客户端连接 print('开始验证新链接的合法性') # 打印提示
msg = os.urandom(32) # 随机生成一个32位的数
conn.sendall(msg) # 连接发送这个随机的数
h = hmac.new(secret_key, msg) # 传入要生成hmac摘要值的信息
digest = h.digest() # 生成一个hmac摘要
respone = conn.recv(len(digest)) # 接收回应,连接接收一个服务器端摘要的长度的信息
return hmac.compare_digest(respone, digest) # 比较客户端和服务端计算的摘要结果,一样则是True,不一样则是False def data_handler(conn, bufsize=1024): # 数据处理机函数(传入两个参数conn,和设置的默认大小)
if not conn_auth(conn): # 如果没有链接
print('该链接不合法,关闭') # 打印该链接不合法,关闭
conn.close() # 关闭链接
return
print('链接合法,开始通信') # 链接合法,开始通信
while True: # 循环为真
data = conn.recv(bufsize) # 接收数据
if not data: break # 如果没有数据则打断
conn.sendall(data.upper()) # 链接发送数据 def server_handler(ip_port, bufsize, backlog=5): # 服务器处理机ip和端口,设置大小
'''
只处理链接
:param ip_port:
:return:
'''
tcp_socket_server = socket(AF_INET, SOCK_STREAM) # 实例化一个tcp的套接字
tcp_socket_server.bind(ip_port) # 绑定ip端口
tcp_socket_server.listen(backlog) # 监听
while True: # 循环为真
conn, addr = tcp_socket_server.accept() # 接收链接和地址
print('新连接[%s:%s]' % (addr[0], addr[1])) # 打印新连接ip和端口
data_handler(conn, bufsize) # 调用数据处理机函数 if __name__ == '__main__':
ip_port = ('127.0.0.1', 9999)
bufsize = 1024
server_handler(ip_port, bufsize)
客户端
from socket import *
import hmac, os secret_key = b'nick' # 设置一个字符串key def conn_auth(conn): # 定义一个客户验证到服务器端的链接
'''
验证客户端到服务器的链接
:param conn:
:return:
'''
msg = conn.recv(32) # 接受一个32位的信息
h = hmac.new(secret_key, msg)
digest = h.digest() # 得到一个摘要值
conn.sendall(digest) # 发送这个摘要 def client_handler(ip_port, bufsize=1024):
tcp_socket_client = socket(AF_INET, SOCK_STREAM) # 创建一个tcp套接字的对象
tcp_socket_client.connect(ip_port) conn_auth(tcp_socket_client) # 执行验证 while True:
data = input('>>: ').strip() # 输入内容
if not data: continue # 如果没有内容则跳过
if data == 'quit': break tcp_socket_client.sendall(data.encode('utf-8')) # 发送数据
respone = tcp_socket_client.recv(bufsize) # 接收数据
print(respone.decode('utf-8')) # 打印接收的数据
tcp_socket_client.close() # 关闭这个套接字 if __name__ == '__main__':
ip_port = ('127.0.0.1', 9999)
bufsize = 1024
client_handler(ip_port, bufsize)
Python之路(第三十四篇) 网络编程:验证客户端合法性的更多相关文章
- Python之路(第三十二篇) 网络编程:udp套接字、简单文件传输
一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...
- Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞
一.理论基础 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的. 即使可以利用的cpu只有一个(早期的 ...
- Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型
一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...
- Python之路(第三十五篇) 并发编程:操作系统的发展史、操作系统的作用
一.操作系统发展史 第一阶段:手工操作 —— 真空管和穿孔卡片 第一代之前人类是想用机械取代人力,第一代计算机的产生是计算机由机械时代进入电子时代的标志,从Babbage失败之后一直到第二次世界大 ...
- Python之路【第十四篇】:AngularJS --暂无内容-待更新
Python之路[第十四篇]:AngularJS --暂无内容-待更新
- Python之路【第二十四篇】:Python学习路径及练手项目合集
Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Py ...
- Python之路【第二十四篇】Python算法排序一
什么是算法 1.什么是算法 算法(algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出.简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果. ...
- Python之路【第十四篇】前端补充回顾
布局和事件 1.布局 首先看下下面的图片: 上面的内容都是居中的,怎么实现这个效果呢,第一种方法是通过float的方式,第二种是通过“div居中的方式” 第一种方式不在复述了,直接看第二种方式: 1. ...
- 【Python之路】第十四篇--jQuery
jquery简介 1.jquery是什么 ☛ 参考用法 jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. jQuery ...
随机推荐
- gentoo virtual couldnt download
今天在更新系统的时候,提示 virtualbox-bin 从原始地址下载不了,经过一番摸索,通过下面的方式即可正常安装. http://download.virtualbox.org/virtualb ...
- spring boot 拦截异常 统一处理
spring boot 默认情况下会映射到 /error 进行异常处理,提示不友好,需要自定义异常处理,提供友好展示 1.自定义异常类(spring 对于 RuntimeException 异常才会进 ...
- 一些常见的Java面试题 & 面试感悟
< 前言 > 近期在面试,深感这个行业的浮躁,一些菜不辣基的弱鸡开出的工资待遇要求,超过了我.不知道他们是怎么拿到那么高的工资的,难道是他在公司有亲戚朋友吗?有后台吗?是行业热钱真的过多了 ...
- 0 Python学习计划
每天一小节,坚持水滴石穿. 2019-4-1 景略
- android studio 运行项目时waiting for target device to come online
cmd进入命令行,进入adb所在的目录下: 或者在Terminal中输入命令: adb kill-server adb start-server
- SSM的搭建
1.首先是工具的准备. eclipse jdk1.7 maven 3.5.4 tomcat 8.5 2.工具环境的搭建 首先,new建立选择maven project工程,勾选simple proje ...
- WPF 自定义控件缩放
方式一: 自定义控件使用固定大小绘制:控件内的各个子控件大小设定固定值 优点:控件绘制简单.快捷. 缺点:使用时如需缩放,需在自定义控件的外面加一个 ViewBox . 使用示例如下(将 UserCo ...
- Linux安装Tomcat,运行Eclipse,web项目
到官网下载:https://tomcat.apache.org/download-80.cgi 在这里是8.5.39版本 下载tar,gz 提取解压后,我这里是放到opt目录下 cd 切换目录 / ...
- Android studio使用android:style/Theme.Dialog报错:You need to use a Theme.AppCompat theme (or descendant) with this activity. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
查找原因是在activity java代码部分继承了compatactivity public class DialogActivity extends AppCompatActivity 但是在An ...
- 上位机与三菱FX3U通过FX-232-BD通信
PLC侧设置: 和校验+协议4 读D200单字: 05 30 30 46 46 57 52 30 44 30 32 30 30 30 31 返回“201”:02 30 30 46 46 30 ...