老师博客:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label6

server端

import socket
import os
import hmac
server=socket.socket()
ip_port=('192.168.43.155',8888)
server.bind(ip_port)
server.listen()
client,addr=server.accept()
secret_key=bytes('lhy'.encode('utf-8'))
def checkout():
random=os.urandom(32)#返回的bytes类型
secret_info=hmac.new(secret_key,random)
server_secret = secret_info.digest()#返回的是bytes
client.send(random)
client_secret=client.recv(1024)
if client_secret==server_secret:
print('检验成功,合法的客户端')
check_out='true'
else:
print('不合法的客户端')
check_out='false'
client.send(bytes(check_out.encode('utf-8')))
checkout()

client端

import socket
import hmac
client=socket.socket()
ip_port=('192.168.43.155',8888)
client.connect(ip_port)
secret_key=bytes('lhy'.encode('utf-8'))
def checkout():
msg=client.recv(1024)
secret_msg=hmac.new(secret_key,msg)
client_secret=secret_msg.digest()
client.send(client_secret)
check_out=client.recv(1024).decode('utf-8')
if check_out=='true':
print('合法的客户端')
else:
print('不合法的客户端')
checkout()

这只是很简单的客户端的合法验证,只是小小的写了一下而已。值得注意的是os.urandom和digest返回的都是bytes类型的数据。所以发送的接受的时候都不需要encode

下面来看看hashlib的客户端的验证方式。

server端

import socket
import os
import hashlib
server=socket.socket()
ip_port=('192.168.43.155',8888)
server.bind(ip_port)
server.listen()
client,addr=server.accept()
secret_key=bytes('lhy'.encode('utf-8'))
def checkout():
random=os.urandom(32)#返回的bytes类型
secret_info=hashlib.md5(secret_key)
secret_info.update(random)
server_secret = secret_info.hexdigest()#返回的是bytes
client.send(random)
client_secret=client.recv(1024).decode('utf-8')
if client_secret==server_secret:
print('检验成功,合法的客户端')
check_out='true'
else:
print('不合法的客户端')
check_out='false'
client.send(bytes(check_out.encode('utf-8')))
checkout()

client端

import socket
import hashlib
client=socket.socket()
ip_port=('192.168.43.155',8888)
client.connect(ip_port)
secret_key=bytes('lhy'.encode('utf-8'))
def checkout():
msg=client.recv(1024)
secret_msg=hashlib.md5(secret_key)
secret_msg.update(msg)
client_secret=secret_msg.hexdigest().encode('utf-8')
client.send(client_secret)
check_out=client.recv(1024).decode('utf-8')
if check_out=='true':
print('合法的客户端')
else:
print('不合法的客户端')
checkout()

这代码几乎和hmac一模一样,注意的是hashlib必需hash的是bytes,返回的确实str的类型。而hmac无论hash还是返回的值都是bytes类型

hmac_检验客户端是否合法的更多相关文章

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

    Hmac模块 其实这个模块类似hashlib模块,它能将一些重要的信息通过算法加密成密文,让信息更具有安全性. 关于hmac加密算法的了解:它的全名是哈希运算消息认证码(Hash-based Mess ...

  2. hmac检验客户端合法性

    1.服务端 # 验证客户端是否合法 # 不依靠登陆认证 # 当有一个客户端访问你的时候,建立了tcp后,server端主动发起一个数据,数据为想加密的bytes类型的数据. # 客户端拿到要加密的by ...

  3. ecshop检验邮件是否合法

    <?php /** * 验证输入的邮件地址是否合法 * * @access public * @param string $email 需要验证的邮件地址 * * @return bool */ ...

  4. day31-hmac模块检测客户端是否合法

    #如果客户端知道服务端的ip地址和端口,就可以连接服务端,信息不安全. #使用os.urandam随机生成32位bytes,然后hmac加密之后再发送给客户端. #server: import soc ...

  5. JAVA正则-检验QQ是否合法

    /* * 0不能开头,全数字,位数5-10位 * 123456 */ public static void checkQQ(){ String QQ = " 123456 "; / ...

  6. socketv 验证客户端链接的合法性,socketserver

    补充: send()与sendall() 在python socket编程中,有两个发送TCP的函数,send()与sendall(),区别如下: socket.send(string[, flags ...

  7. Day 35 验证客户端的合法性+socketserver

    一 .getpeername和getsoketopt的用法 服务器端代码 import socket sk =socket.socket() sk.bind(('127.0.0.1',9000)) s ...

  8. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q66-Q68)

    Question 66 You are designing an application that will use a timer job that will run each night to s ...

  9. django-表单

    一.从Request对象中获取信息 1.URL相关的信息 属性/方法 说明 举例 request.path 除域名以外的请求路径,以正斜杠开头 "/hello/" request. ...

随机推荐

  1. Nginx学习系列三Nginx的启动、停止、修改配置文件后重启

    1.启动Nginx 命令规则:Ngxin的安装地址 -c Nginx的安装地址下的配置文件地址 注意:一般都在root权限下进行Nginx的启动 2.停止Nginx (1).从容停止 第一步:查看Ng ...

  2. TypeError: unorderable types: str() >= int()

    1.问题描述 age=input('please enter your age') if age >=18: print('your age is',age) print('adult') el ...

  3. 你安装的是SUN/Oracle JDK还是OpenJDK?

    目录 1 如何查看你安装的JDK版本 1.1 要用到的命令行工具 1.2 查看JDK的版本 2 什么是 OpenJDK 2.1 OpenJDK 的来历 2.2 Oracle JDK的来历 3 Orac ...

  4. 浅谈新的布局方式-flex

    引言: 网页布局在flex出来之前,是由盒模型为底子,float,position,table,百分比来进行布局的,重绘的比较多,影响性能,复杂又不好维护.flex布局,可以简便.完整.响应式地实现各 ...

  5. CentOs~程序部署那些事

    永久更新中…… 主要说一下在centos里,在安装程序和监控程序时,用到的一些常用的命令,希望可以帮到大家! 远程安装程序包:yum install 程序包名 下载程序包:wget 程序包地址 解压t ...

  6. 你可能不知道的css-doodle

    好久没写文章了,下笔突然陌生了许多. 第一个原因是刚找到一份前端的工作,业务上都需要尽快的了解,第二个原因就是懒还有拖延的习惯,一旦今天没有写文章,就由可能找个理由托到下一周,进而到了下一周又有千万条 ...

  7. RabbitMQ消息队列(十一)-如何实现高可用

    在前面讲到了RabbitMQ高可用集群的搭建,但是我们知道只是集群的高可用并不能保证应用在使用消息队列时完全没有问题,例如如果应用连接的RabbitMQ集群突然宕机了,虽然这个集群时可以使用的,但是应 ...

  8. javaWeb项目中的路径格式 请求url地址 客户端路径 服务端路径 url-pattern 路径 获取资源路径 地址 url

    javaweb项目中有很多场景的路径客户端的POST/GET请求,服务器的请求转发,资源获取需要设置路径等这些路径表达的含义都有不同,所以想要更好的书写规范有用的路径代码 需要对路径有一个清晰地认知 ...

  9. JVM(二)Java虚拟机组成详解

    导读:详细而深入的总结,是对知识"豁然开朗"之后的"刻骨铭心",想忘记都难. Java虚拟机(Java Virtual Machine)下文简称jvm,上一篇我 ...

  10. DSAPI多功能组件编程应用-文件类

    [DSAPI.DLL下载地址]     本节内容,是属于"无需过多说明"就能使用的功能.由于实在是太简单,我就简单地示例一下. DSAPI.文件类.获取可读性强的字节大小信息(&q ...