+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2019-08(106)

2019-09(105)

2019-10(7)

2019-11(8)

2019-12(13)

2020-01(23)

2020-02(22)

Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块

发布于2020-01-01 12:30     阅读(75)     评论(0)     点赞(5)     收藏(0)


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文章

作者:短发越来越短

链接: http://www.pythonheidong.com/blog/article/197589/

来源:python黑洞网 www.pythonheidong.com

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

5 0

赞一赞 or 踩一踩

收藏该文
已收藏

评论内容:(最多支持255个字符)

相似文章

  re学习笔记(42)安恒杯二月月赛-re- easy-py

  用Python3解决LeetCode买卖股票的最佳时机

  《Opencv计算机视觉实战》笔记_1:图像操作

  记录python之pyecharts安装

  使用python列表的pop方法求解约瑟夫环问题

  03.分支结构

  Python数据结构与算法(1)——引入

  【Django 003】创建多个应用拆分项目.

  python经典练习题十道(六)

  Numpy 的常用操作

优质资源排行榜

 python经典电子书大合集下载 下载次数 8139

 零基础java开发工程师视频教程全套,基础+进阶+项目实战(152G) 下载次数 7550

 零基础前端开发工程师视频教程全套,基础+进阶+项目实战(共120G) 下载次数 7442

 零基础大数据全套视频400G 下载次数 7006

 零基础php开发工程师视频教程全套,基础+进阶+项目实战(80G) 下载次数 6893

 零基础软件测试全套系统教程 下载次数 6506

 全套人工智能视频+pdf 下载次数 6443

 IOS全套视频教程 基础班+就业班 下载次数 4680

 编程小白的第一本python入门书(高清版)PDF下载 下载次数 3654

10  effective python编写高质量Python代码的59个有效方法 pdf下载 下载次数 3366

11  Python深度学习 pdf下载 下载次数 3156

12  笨办法学python pdf下载 下载次数 3088

13  Python Cookbook第三版中文PDF下载高清完整扫描原版 下载次数 3025

14  树莓派Python编程指南 pdf下载 下载次数 3011

15  python从入门到精通视频(全60集)python视频教程下载 下载次数 3009

16  python项目开发视频 下载次数 3002

17  使用python+pygame开发的小游戏《嗷大喵快跑》源码下载 下载次数 3000

18  黑马2017年java就业班全套视频教程 下载次数 2992

19  Python基础教程 pdf下载 下载次数 2988

20  python实战项目 平铺图像板系统源码下载,适用于想要保存,标记和共享图像,视频和网页的用户 下载次数 2987

21  利用python实现程序内存监控脚本 下载次数 2987

22  老男孩python自动化视频 下载次数 2983

23  老王python基础+进阶+项目视频教程 下载次数 2974

24  尚硅谷Go学科全套视频 下载次数 2972

25  某硅谷Python项目+AI课程+核心基础视频教程 下载次数 2968

26  Web前端实战精品课程 下载次数 2967

27  Python算法教程_中文版 pdf下载 下载次数 2967

28  tron python小游戏 下载次数 2963

29  [小甲鱼]零基础入门学习Python 下载次数 2962

30  老男孩python全栈开发15期 下载次数 2958

31  2017最新web前端开发完整视频教程附源码 下载次数 2948

32  最新全套完整JAVAWEB2018开发视频 下载次数 2926

33  流畅的Python PDF下载高清完整扫描原版 下载次数 2922

34  Spring boot实战视频6套下载 下载次数 2910

35  Python高性能编程 pdf下载 下载次数 2908

36  python全套视频十五期(116G) 下载次数 2908

37  Python项目实战 下载次数 2887

38  利用Python进行数据分析 pdf下载 下载次数 2885

39  30个小时搞定Python网络爬虫 含源码 下载次数 2884

40  简明python教程 (A Byte of Python)pdf下载 下载次数 2884

41  python全自动抢火车票教程-python视频教程下载 下载次数 2883

42  尚硅谷大数据之Hadoop视频 下载次数 2876

43  Python A~B~C~ python视频教程下载 下载次数 2866

44  数据结构与算法视频(小甲鱼讲解-全) 下载次数 2864

45  web小程序表白天数倒计时源码下载 下载次数 2863

46  python基础视频教程 下载次数 2862

47  go语言全套视频 下载次数 2855

48  清华学霸尹成Python爬虫视频-ok 下载次数 2846

49  黑马前端36期最全视频和代码 下载次数 2843

50  2018最新全套web前端视频教程+源码下载 下载次数 2842