目录

1.socketserver:实现TCP协议下Server端的并发

2.hashlib模块

3.hashlib应用:文件校验

4.hmac应用:服务器的合法性校验

5.TCP登录程序

1.socketserver:实现TCP协议下Server端的并发

1.socketserver的基本语法

服务端

# ### 服务端
import socketserver class MyServer(socketserver.BaseRequestHandler):
def handle(self):
print("handle方法被执行了") # ThreadingTCPServer(ip端口号,自定义的类)
server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000) , MyServer )
# 建立连接,循环调用
server.serve_forever()

客户端

# ### 客户端
import socket
sk = socket.socket()
sk.connect( ("127.0.0.1",9000) ) # 处理收发数据的逻辑 sk.close()

2.socketserver实现server端的并发

服务端

# ### 服务端
import socketserver class MyServer(socketserver.BaseRequestHandler):
def handle(self):
conn = self.request # self.request就是我们之前熟悉的conn对象
while True:
# 接受数据
msg = conn.recv(1024)
msg2 = msg.decode("utf-8") print(msg2)
conn.send(msg2.upper().encode()) # ThreadingTCPServer(ip端口号,自定义的类)
server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000) , MyServer )
# 建立连接,循环调用
server.serve_forever()

客户端

# ### 客户端
import socket
sk = socket.socket()
sk.connect( ("127.0.0.1",9000) )
# 处理收发数据的逻辑
while True:
sk.send(b"you can you up no can no bb") msg = sk.recv(1024)
print(msg.decode("utf-8"))
sk.close()

3.关于sockerserver,你需要注意:.

1.在server端定义MyServer类,继承BaseRequestHandler类

2.收发数据的逻辑都写在MyServer类下的handler方法中,注意!函数名只能为handle,不可以乱起函数名

3.定义完类,要做两件事

  server = socketserver.ThreadingTCPServer( ("127.0.0.1",9000) , MyServer )

  server.serve_forever()

2.hashlib模块

1.基本用法

# 基本用法
# 1.创建一个md5算法的对象
hm = hashlib.md5()
# 2.把要加密的字符串通过update更新到hm这个对象中运算
hm.update("123456".encode("utf-8")) # 里面的数据必须是二进制字节流
# 3.获取32位16进制字符串
res = hm.hexdigest()

2.味道不够?加盐!!

什么是加盐? 加盐(加key => Xboy_) 加一个关键字配合原字符进行加密,是密码更复杂,不容易被破解

# 加盐(加key => Xboy_) 加一个关键字配合原字符进行加密,是密码更复杂,不容易被破解
hm = hashlib.md5("Xboy_wangwen".encode())
hm.update("123456".encode())
res = hm.hexdigest()
print(res , len(res))

3.进阶版:动态加盐

通过引入随机数模块,每次都生成一个不同的数字和密码进行加密

# 动态加盐
num = str(random.randrange(100000,1000000))
hm = hashlib.md5(num.encode("utf-8"))
hm.update("123456".encode())
res = hm.hexdigest()

4.除了常见的md5加密,还有sha加密

sha和md5的不同之处:

sha 算出来的十六进制的串是40位,加密稍慢,安全性稍高

md5 算出来的十六进制的串是32位,加密很快,安全性稍差

# sha1版本
hs = hashlib.sha1()
hs.update("我最是牛逼的&#*($&*(#&%*(&%*&%(#%&".encode())
res = hs.hexdigest()
print(res, len(res)) # 31673dd65f81fddaae07b4240cbb04af047b7496 # sha512版本
hs = hashlib.sha512()
hs.update("123456".encode())
res = hs.hexdigest()
print(res , len(res))

5.还有更牛逼的hmac加密

hmac加密的优势:hmac 加密算法更加复杂,不容易破解

1.基本语法

import hmac
# hmac.new(盐,密码)
key = b"a"
msg = b"123456"
hn = hmac.new(key,msg)
res = hn.hexdigest()
print(res, len(res)) # 32位长度 十六进制的字符串

2.动态加盐

在加盐前,我们需要了解一个知识:通过os.urandom 可以返回随机的二进制字节流

key = os.urandom(32)
msg = b"123"
hn = hmac.new(key,msg)
res = hn.hexdigest()
print(res, len(res))

3.hashlib应用:文件校验

1.针对于小文件进行内容校验

# (1) 针对于小文件进行内容校验
def check_md5(filename):
hs = hashlib.md5() # 创建md5加密对象
with open(filename,mode="rb") as fp: # 打开文件
hs.update(fp.read()) # 将读出的内容(字符串)通过update更新到hs对象中进行加密运算
return hs.hexdigest() # 返回加密后的16进制字符串 res1 = check_md5("ceshi1.txt")
res2 = check_md5("ceshi2.txt")
print(res1,res2)

2.针对于大文件进行内容校验

针对于大文件进行内容校验,我们可以通过update 把字符串分段进行加密

# 常规方法
strvar = "今天是星期五,好开心了,下周一又要考试了."
hm = hashlib.md5()
hm.update(strvar.encode())
res = hm.hexdigest()
print(res) # 分段更新加密
hm = hashlib.md5()
hm.update("今天是星期五,好开心了,".encode())
hm.update("下周一又要考试了.".encode())
res = hm.hexdigest()
print(res)

通过运行我们可以发现两个res的值是相同的,说明了大文件分段加密是可行的

3.用文件操作对大文件进行分段加密

方法一

# 方法一
def check_md5(filename):
hs = hashlib.md5() # 先弄个md5的加密对象
with open(filename,mode="rb") as fp: # 打开文件
while True:
content = fp.read(10) # 一次最多读取10个字节
if content: # 读取到了内容:代表文件里还有东西
# 分批进行字符串密码更新
hs.update(content)
else: # 读取不到内容:代表文件已经全读取完了,可以结束了
break return hs.hexdigest() res1 = check_md5("ceshi1.txt")
res2 = check_md5("ceshi2.txt")
print(res1,res2)

方法二

def check_md5(filename):
hs = hashlib.md5()
# 计算文件大小=>返回字节数
filesize = os.path.getsize(filename) # 先获取到文件的大小
with open(filename,mode="rb") as fp: # 打开文件
while filesize: # 当文件大小不为0时
content = fp.read(10) # 一次最多读取10个字节
hs.update(content) # 读一点更新一点
# 按照实际的字节个数读取
filesize -= len(content) return hs.hexdigest() res1 = check_md5("ceshi1.txt")
res2 = check_md5("ceshi2.txt")
print(res1,res2)

4.hmac应用:服务器的合法性校验

服务端:

def auth(conn,secret_key):
# 随机产生32位的二进制字节流
msg = os.urandom(32)
conn.send(msg) hn = hmac.new(secret_key.encode(),msg)
res_server = hn.hexdigest()
print(res_server) # 461ea12ca8ef475caeedd0c742f4295e # 服务端接受客户端发送过来的数据进行验证;
res_client = conn.recv(1024).decode("utf-8") if res_client == res_server:
print("你是合法的服务端用户")
return True
else:
print("不是合法的服务端用户")
return False sk = socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sk.bind( ("127.0.0.1",9000) )
sk.listen() # 三次握手
conn,addr = sk.accept() # 处理收发数据的逻辑
secret_key = "芝麻开门"
res = auth(conn,secret_key) # 在验证成功之后,给客户端发送状态码
if res:
conn.send("状态码是200:付款成功~".encode())
# 四次挥手
conn.close()
# 退还端口
sk.close()

客户端:

def auth(sk,secret_key):
# 处理收发数据的逻辑
msg = sk.recv(32)
hn = hmac.new(secret_key.encode(),msg)
res = hn.hexdigest() # 把客户端加密的字符串发送给服务端进行验证
sk.send(res.encode("utf-8")) sk = socket.socket()
sk.connect( ("127.0.0.1",9000) ) # 处理收发数据的逻辑
secret_key = "芝麻开门123"
auth(sk,secret_key) # 在验证成功之后,接受服务端给我的验证码
res = sk.recv(1025).decode("utf-8")
print(res) sk.close()

5.TCP登录程序

服务端:

def get_md5_code(usr,pwd):
hs = hashlib.md5(usr.encode())
hs.update(pwd.encode())
return hs.hexdigest() # res = get_md5_code("tianqi","777")
# print(res) sk = socket.socket()
sk.bind( ("127.0.0.1", 9001) )
sk.listen()
conn,addr = sk.accept() # 处理收发数据的逻辑
msg = conn.recv(1024).decode()
# 把反解之后的字符串恢复原来的数据格式变成字典通过json
dic = json.loads(msg)
print(dic) sign = False
with open("userinfo.txt",mode="r",encoding="utf-8") as fp:
for line in fp:
usr,pwd = line.strip().split(":")
# print(usr,pwd)
if usr == dic["username"] and pwd == get_md5_code(dic["username"],dic["password"]):
# 制定状态码 0=>失败 1=>成功
res = {"code":1}
res_msg = json.dumps(res).encode()
conn.send(res_msg)
sign = True
break if sign == False:
# 发送错误的状态码
res = {"code":0}
res_msg = json.dumps(res).encode()
conn.send(res_msg)

客户端:

sk = socket.socket()
sk.connect( ("127.0.0.1", 9001) ) # 处理收发数据的逻辑
usr = input("请输入您的用户名:")
pwd = input("请输入您的密码:")
dic = {"username":usr,"password":pwd,"operate":"login"}
# 先通过json变成字符串
res = json.dumps(dic)
# json字符串 -> 字节流
bytes_msg = res.encode()
# 把字节流发送给服务端
sk.send(bytes_msg) # 接受服务端发送过来的数据
res_msg = sk.recv(1024).decode()
dic_code = json.loads(res_msg) if dic_code["code"]:
print("恭喜你~ 登录成功")
else:
print("i am so sorry ~ 登录失败") sk.close()

day31:socketserver&hashlib&hmac&TCP登录的更多相关文章

  1. 【Python】 hash值计算 hashlib & hmac

    hashlib & hmac *不是很清楚能不能把这种hash值取样算法称之为加密,但是似乎好像也是这么说的哈(非科班出身的野路子就是没这种基本知识的) ■ 基本用法 hashlib支持MD5 ...

  2. Python中模块之hashlib&hmac的讲解

    hashlib & hmac的讲解 两个模块主要用于加密相关的操作. 1. hashlib模块 md5 具体代码如下 import hashlib ha_m5 = hashlib.md5()# ...

  3. Python——常用模块(time/datetime, random, os, shutil, json/pickcle, collections, hashlib/hmac, contextlib)

    1.time/datetime 这两个模块是与时间相关的模块,Python中通常用三种方式表示时间: #时间戳(timestamp):表示的是从1970年1月1日00:00:00开始按秒计算的偏移量. ...

  4. Python网络编程(2)-粘包现象及socketserver模块实现TCP并发

    1. 基于Tcp的远程调用命令实现 很多人应该都使用过Xshell工具,这是一个远程连接工具,通过上面的知识,就可以模拟出Xshell远程连接服务器并调用命令的功能. Tcp服务端代码如下: impo ...

  5. 20 常用模块 hashlib hmac:加密 xml xlrd xlwt:excel读|写 configparser subprocess

    hashlib模块:加密 加密: 1.有解密的加密方式 2.无解密的加密方式:碰撞检查 hashlib -- 1)不同数据加密后的结果一定不一致 -- 2)相同数据的加密结果一定是一致的 import ...

  6. hashlib hmac configparser subprocess xlrd xlwt

    hashlib模块:加密 import hashlib # 基本使用 cipher = hashlib.md5('需要加密的数据的二进制形式'.encode('utf-8')) print(ciphe ...

  7. hashlib,hmac,subprocess,configparser,xlrd,xlwt,xml模块基本功能

    hashlib模块:加密 import hashlib# 基本使用cipher = hashlib.md5('需要加密的数据的二进制形式'.encode('utf-8'))print(cipher.h ...

  8. Python3学习之路~5.12 hashlib & hmac & md5 & sha模块

    hashlib模块用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import md5 h ...

  9. Python hashlib&hmac 模块

    用于加密相关的操作,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 hashlib模块示例: import hashlib m = hashlib. ...

  10. hashlib 简单的登录例子

    hashlib例子: =============================================== import hashlib md5 = hashlib.md5() md5.up ...

随机推荐

  1. HTML悬浮div

    需求,html底部为地图,上层是各个div HTML<body> //地图 <div id='map' id="demo1"></div> &l ...

  2. java接口自动化需要的技术

    1.testNG需要了解的知识 ITestContext这个类可以直接在方法参数里使用,主要作用是可以通过它的context.getSuite()直接获取suite的相关信息.还可以通过它的 cont ...

  3. Glass Beads

    UVA719 将循环串SSS展开成两倍大小:S+SS+SS+S,这样线性处理就可以处理所有循环的情况了.对S+SS+SS+S建立一个后缀自动机,让后从初始状态开始走,每次选择字典序最小的道路,走NNN ...

  4. K8S中Pod概念

    一.资源限制 Pod 是 kubernetes 中最小的资源管理组件,Pod 也是最小化运行容器化应用的资源对象.一个 Pod 代表着集群中运行的一个进程.kubernetes 中其他大多数组件都是围 ...

  5. linux 获取文件名

    https://blog.csdn.net/liuyuedechuchu/article/details/123778605

  6. Adaboost分类器

    Adaboost分类器 2019-08-31 非集成的机器学习算法就像古代皇帝一样,一个人说了算:集成学习算法类似于现在的国会,需要听取在会所有人的意见. Adaboost是一个集成学习算法,下面将会 ...

  7. jxg项目Day1-配置

    1.搭建mysql与datagrip的连接(还未完成建表学习) 2.搭好项目框架:目前划分: maven我是直接复制的之前的两个项目的依赖,但是测试的时候遇到点问题:说数据库连不上,但是我明明已经配置 ...

  8. 如何快速开发一套cesium三维系统

    首先我们需要明确我们做的三维应该具有哪些功能,常见的三维系统主要用于展示三维数据,常见的功能应该有,缩放平移,漫游浏览,定位,量测,图层控制等基础功能.在这些基础功能上根据业务需要,再继续扩展,添加一 ...

  9. Java基础学习——Scanner

    import java.util.Scanner; public class HelloWord{ public static void main(String[] args){ Scanner s= ...

  10. Django数据迁移介绍

    1.简介 迁移是 Django 将你对模型的修改(例如增加一个字段,删除一个模型)应用至数据库表结构对方式 2.基本命令 python manage.py migrate---负责应用和撤销迁移 py ...