• socketserver hashlib hmac


    1. socketserver: 网络协议的最底层就是socket,基于原有socket模块,又封装了一层,就是socketserver, socketserver 为了实现tcp协议,server端的并发.

    # 服务端
    # 用socketserver解决TCP的并发问题
    import socketserver
    class Myserver(socketserver.BaseRequestHandler):
        def handle(self):
            conn = self.request  # 由socketserver封装好的连接对象
            addr = self.client_address  # 由socketserver封装好的客户端IP端口号
            while True:
                res = conn.recv(1024)
                print(res.decode())
    
                strvar = input("服务端给客户端的消息: ")
                conn.send(strvar.encode())
    
                if strvar.upper() == "Q":
                    break
    
    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:
        strvar = input("客户端给服务端的消息: ")
        sk.send(strvar.encode())
    
        res = sk.recv(1024)
        if res.upper() == b"Q":
            break
        print(res.decode())
    
    sk.close()

    2. hashlib模块: 这个模块是一堆加密算法的集合体,哈希算法的加密方式不止一种.哈希算法也叫摘要算法,相同的数据始终得到相同的输出,不同的数据得到不同的输出.

    https://www.cmd5.com/ md5解密网站

    import hashlib
    # 1. 创建一个md5算法的对象
    hs = hashlib.md5()
    # 2. 把要加密的数据通过update更新到hs对象中运算
    hs.update("今天天气不错!".encode("utf-8")) # 里面的数据需转换成二进制字节流
    # 3. 获取32位的十六进制的字符串
    res = hs.hexdigest()
    print(res, len(res))
    # 6abad61b6c635c28f65237cc10633c9d 32
    
    # 加盐(加一个关键字配合原字符串,让密码更加复杂,不容易破解)
    hs = hashlib.md5("加盐关键字".encode("utf-8"))
    hs.update("今天天气不错".encode("utf-8"))
    res = hs.hexdigest()
    print(res, len(res))
    # 306212c24f8aadbbaf3547ca280f9f6d 32
    
    # 动态加盐
    import random
    num = random.randrange(10)
    b_word = chr(random.randrange(65,91))
    s_word = chr(random.randrange(97,123))
    lst = [num,b_word,s_word]
    key_lst = random.sample(lst,3)
    key = str(key_lst)
    print(key) # ['Q', 'k', 6]
    
    hs = hashlib.md5(key.encode("utf-8"))  # md5加密算法速度稍快,但是安全性一般
    hs.update("今天天气不错".encode("utf-8"))
    res = hs.hexdigest()
    print(res, len(res))
    # a47abd6ba40e3fb0fd7d9a2fd9055df3 32
    
    hs = hashlib.sha224()  # sha加密算法速度稍慢,但是安全性较高
    hs.update("今天天气不错".encode())
    res = hs.hexdigest()
    print(res, len(res))
    # b61a712d8c6712a48513092cda18a91291f734bf9bd430da410fe758 56
    
    hs = hashlib.sha512()
    hs.update("今天天气不错".encode())
    res = hs.hexdigest()
    print(res, len(res))
    # 5c70d47381a5631fa9912d152b13a066e387e5cbfdca2fc47e05ff1217bf29d2b7930d73576f7eb71780baad3a2dde6bb0075fd6ab9fb8a12f11f9fb51846d0a 128

    3. hmac模块: 算法更加复杂,不容易破解

    import hmac
    key = "加盐".encode()
    msg = "今天天气不错".encode()
    hm = hmac.new(key,msg)
    res = hm.hexdigest()
    print(res, len(res))
    # 3339c19e0c535dc72148957352173885 32
    
    # 动态加盐
    # 方式一:
    import random
    num = random.randrange(10)
    b_word = chr(random.randrange(65,91))
    s_word = chr(random.randrange(97,123))
    lst = [num,b_word,s_word]
    key_lst = random.sample(lst,3)
    
    key = str(key_lst).encode()
    msg = "今天天气不错".encode()
    
    hm = hmac.new(key,msg)
    res = hm.hexdigest()
    print(res, len((res)))
    # 13051eeeaf99a22dd32a366a5cafe908 32
    
    # 方式二:
    import os
    key = os.urandom(32) # 返回随机的二进制字节流, 参数:代表的长度
    msg = "今天天气不错".encode()
    hm = hmac.new(key,msg)
    res = hm.hexdigest()
    print(res, len(res))
    # 39edbcf1109a51d05f59386d6bb5b241 32

    4. 案例之根据hashlib模块进行文件校验

    # 文件校验
    # 小文件
    import hashlib
    def check_file(file):
        with open(file,mode="rb") as fp:
            hs = hashlib.md5()
            hs.update(fp.read())
        return hs.hexdigest()
    
    res1 = check_file("D:python学习上课代码day29--socketserver, hashlib, hmac作业.txt")
    res2 = check_file("D:python学习上课代码day29--socketserver, hashlib, hmac作业 - 副本.txt")
    print(res1, res2)
    # 09e928cf9048a274cbec915a9c96f7a4 09e928cf9048a274cbec915a9c96f7a4
    
    # 大文件
    # 方式一:
    def check_file(file):
        hs = hashlib.md5()
        with open(file,mode="rb") as fp:
            while True:
                # 一次最多读取1024个字节
                content = fp.read(1024)
                if content:
                    # 将读出的字节分批更新计算
                    hs.update(content)
                else:
                    break
            return hs.hexdigest()
    res1 = check_file("D:python学习上课代码day29--socketserver, hashlib, hmac作业.txt")
    res2 = check_file("D:python学习上课代码day29--socketserver, hashlib, hmac作业 - 副本.txt")
    print(res1, res2)
    # 09e928cf9048a274cbec915a9c96f7a4 09e928cf9048a274cbec915a9c96f7a4

    # 方式二: import os def check_file(file): hs = hashlib.md5() file_size = os.path.getsize(file) with open(file,mode="rb") as fp: while file_size: content = fp.read(1024) hs.update(content) file_size -= len(content) return hs.hexdigest() res1 = check_file("D:python学习上课代码day29--socketserver, hashlib, hmac作业.txt") res2 = check_file("D:python学习上课代码day29--socketserver, hashlib, hmac作业 - 副本.txt") print(res1, res2) # 09e928cf9048a274cbec915a9c96f7a4 09e928cf9048a274cbec915a9c96f7a4

    5. 案例之服务器合法性检验

    # 服务器合法性检验案例
    # 服务器(提供接口)
    import os
    import hmac
    import socket
    def auth(conn,secret_key):
        msg = os.urandom(32)
        conn.send(msg)
        hm = hmac.new(secret_key.encode(),msg)
        res_serve = hm.hexdigest()
        print(res_serve)
        res_client = conn.recv(1024).decode()
    
        if res_serve == res_client:
            print("是合法的连接用户")
            return True
        else:
            print("不是合法的连接用户")
            return False
    
    sk = socket.socket()
    sk.bind(("127.0.0.1",9000))
    sk.listen()
    conn,addr = sk.accept()
    secret_key = "秘钥值"
    
    res = auth(conn,secret_key)
    if res:
        print(conn.recv(1024).decode())
    
    conn.close()
    sk.close()
    
    
    # 服务器(使用接口)
    import socket
    import hmac
    
    def auth(secret_key,sk):
        msg = sk.recv(32)
        hm = hmac.new(secret_key.encode(),msg)
        res = hm.hexdigest()
        print(res)
        sk.send(res.encode())
    
    secret_key = "秘钥值"
    sk = socket.socket()
    sk.connect(("127.0.0.1",9000))
    auth(secret_key,sk)
    
    sk.send("请求使用这个服务器的接口".encode())
    sk.close()
  • 相关阅读:
    Hadoop--单点故障修复
    Hadoop---静动态增删节点
    sqlserver 通知应用程序(存储过程通过http调用接口)
    sqlserver 资源等待
    sqlserver 性能优化
    sqlserver 资源等待
    sqlserver 查看内存情况
    sqlserver动态管理视图
    常见散列算法
    sqlserver 性能检测 和 监控
  • 原文地址:https://www.cnblogs.com/fdsimin/p/13067396.html
Copyright © 2020-2023  润新知