python3-socket验证客户端连接的合法性,下载进度条的实现

验证客户端链接的合法性

如果你想在分布式系统中实现一个简单的客户端链接认证功能,又不像SSL那么复杂,那么利用md5+加盐或者hmac+加盐的方式来实现

原理图

为什么要随机字符串,是为了防止网络传输过程中,被截取。

md5的实现方法

server端代码

import os
import socket
import hashlib

sk = socket.socket()
secret_key = '今晚打老虎'
sk.bind(('127.0.0.1', 9595))
sk.listen()

while True:
    try:
        conn, addr = sk.accept()
        random_bytes = os.urandom(32)  # 随机返回一个长度为32位的bytes类型的组合
        conn.send(random_bytes)
        md5 = hashlib.md5(secret_key.encode('utf-8'))
        md5.update(random_bytes)
        ret = md5.hexdigest()
        msg = conn.recv(1024).decode('utf-8')
        if msg == ret:print('是合法的客户端')
        else:conn.close()
    finally:
        sk.close()
        break

client端代码

import socket
import hashlib

secret_key = '今晚打老虎'
sk = socket.socket()
sk.connect(('127.0.0.1', 9595))

urandom = sk.recv(1024)
md5_obj = hashlib.md5(secret_key.encode('utf-8'))
md5_obj.update(urandom)
sk.send(md5_obj.hexdigest().encode('utf-8'))
print('---------')
sk.close()

先运行server,再运行client,执行结果为

是合法的客户端

hmac模块,专门用来做客户端合法性验证的(加密认证)

server端代码

import os
import socket
import hmac

secret_key = '床前明月光'.encode('utf-8')
sk = socket.socket()
sk.bind(('127.0.0.1', 9595))
sk.listen()

while True:
    try:
        conn, addr = sk.accept()  # 建立连接
        random_bytes = os.urandom(32)  # 随机一个32长度的bytes类型组合
        conn.send(random_bytes)
        obj = hmac.new(key=secret_key, msg=random_bytes)
        ret = obj.hexdigest()
        msg = conn.recv(1024).decode('utf-8')
        if msg == ret:print('是合法的客户端')
        else:conn.close()
    finally:
        sk.close()
        break

client端代码

import socket
import hmac

secret_key = '床前明月光'.encode('utf-8')
sk = socket.socket()
sk.connect(('127.0.0.1', 9595))

urandom = sk.recv(32)
hmac_obj = hmac.new(key=secret_key, msg=urandom)
sk.send(hmac_obj.hexdigest().encode('utf-8'))
print('---------')
sk.close()

先运行server,再运行client,执行结果为

是合法的客户端

socketserver

实现多个客户端,同时连接

socketserver端代码

import socketserver
class MyServer(socketserver.BaseRequestHandler):
    def handle(self):
        while True:
            print(self.request)  # 这里不能使用input,否则卡住了
            self.request.send(b'hello')  # 跟所有的client打招呼
            print(self.request.recv(1024))  # 接收客户端的信息
if __name__ == '__main__':
    socketserver.TCPServer.allow_reuse_address = True
    server = socketserver.ThreadingTCPServer(('127.0.0.1', 9000), MyServer)
    server.serve_forever()

client端代码

import socket
sk = socket.socket()
sk.connect(('127.0.0.1', 9000))

while True:
    print(sk.recv(1024))
    inp = input('>>>').encode('utf-8')
    sk.send(inp)

sk.close()

先运行socketserver,在运行client,执行结果如下,发送一个消息,打印一次hello,可以同时开多个client执行

模拟下载进度条:

import sys
import time
def processBar(num, tital):
    rate = num / tital
    rate_num = int(rate*100)
    if rate_num == 100:
        r = '\r下载进度: {}%\n'.format(rate_num)
    else:
        r = '\r下载进度: {}%'.format(rate_num)
    sys.stdout.write(r)
    sys.stdout.flush

for i in range(101):
    processBar(i, 100)  # 需要传入下载进度和文件总大小 
    time.sleep(0.1)  # 模拟下载延迟

执行结果

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Flutter&Dart

DartVM服务器开发(第十八天)--项目部署到云服务器

先购买一台云服务器,我选择的是Ubuntu / 16.04 LTS amd64 (64bit)操作系统

28830
来自专栏张戈的专栏

Linux系统date命令无法修改或同步时间的解决办法

今天,在站长交流群里面,又一个站长抱怨服务器每星期都必须手动重启一次,否则 QQ 登陆功能无法使用,原因是服务器时间快了 5 分钟以上,腾讯服务器拒绝提供 AP...

43840
来自专栏ytkah

thinkcmf安装教程与目录结构详解 快速上手版

  最近接了一个建站项目,要求用thinkcmf来搭建,ytkah在想php都大致一样吧,快速地下载安装包,可是!怎么安装呢?没看到安装指引文件或目录,查看了安...

54440
来自专栏阮一峰的网络日志

Content Security Policy 入门教程

跨域脚本攻击 XSS 是最常见、危害最大的网页安全漏洞。 ? 为了防止它们,要采取很多编程措施,非常麻烦。很多人提出,能不能根本上解决问题,浏览器自动禁止外部注...

33750
来自专栏云计算教程系列

如何在CentOS 7上使用Linux审计系统

在Linux审核系统可以帮助系统管理员创建一个审计跟踪,日志服务器上的每一个动作。我们可以通过检查审计日志文件来跟踪与安全相关的事件,将事件记录在日志文件中,以...

1.2K50
来自专栏容器云生态

根据红帽RHEL7官方文档对centos7进行技术剖析(三)

第一章:高级网络配置 1.虚拟网卡的添加 ifconfig eth0:1 10.0.0.2 netmask 255.255.255.0 临时添加虚拟网卡 永久保...

61980
来自专栏张戈的专栏

Win平台Web访问白名单设置脚本(IP安全性原则)

最近老是有用户申请开通某网站的访问权限,我接手之前浏览权限的设置方法是修改 tomcat 下的 server.xml 配置文件,通过定义 allow="IP.....

57470
来自专栏cs

linux学习六

网络服务 常用网络服务器软件 服务类型 软件名称 服务类型 软件名称 NFS 服务 NFS DNS服务 DNS Web服务 Apache Ma...

29690
来自专栏北京马哥教育

利用TCMalloc优化Nginx的性能

TCMalloc的全称为Thread-Caching Malloc,是谷歌开发的开源工具google-perftools中的一个成员。与标准的glibc库的Ma...

25850
来自专栏Flutter入门到实战

Flutter填坑全面总结

Flutter是一个新的跨平台开发的工具,博主也玩了一段时间,一步步的踩着坑摸石头过河,这其中受尽了各种各样的坑,各种谷歌,stackoverflow,Flut...

63320

扫码关注云+社区

领取腾讯云代金券