hmac检验客户端合法性

  1.服务端

# 验证客户端是否合法
# 不依靠登陆认证

# 当有一个客户端访问你的时候,建立了tcp后,server端主动发起一个数据,数据为想加密的bytes类型的数据。
    # 客户端拿到要加密的bytes类型的数据,

# import hmac     # 该模块与hashlib类似
# import os
#
# h = hmac.new()  # secret_key 需要一个密钥,与想要加密的bytes类型数据
# content = h.digest()  # 拿到一个密文内容
# hmac.compare_digest()   # 比较 ,密文与另外一个密文
#
# print(os.urandom(32))   # 随机生成32个字节

import socket
import hmac     # 该模块与hashlib类似
import os

def check_conn(conn):
    random_msg = os.urandom(32) # 得到一个随机的32个字节
    conn.send(random_msg)   # 随机发送32个字节
    h = hmac.new(secret_key, random_msg)    # 使用密钥secret_key对发送出去的32个随机字节进行加密得到一个hmac对象
    digest = h.digest()     # 由hmac对象得到一个密文
    client_digest = conn.recv(1024)
    return hmac.compare_digest(digest, client_digest)  # 比较自己对32个字节加密后得到的密文,与客户端得到32个字节后加密得到的密文是否一样

secret_key = b‘egg‘  # 密钥
sk = socket.socket()

sk.bind((‘127.0.0.1‘, 8090))

sk.listen()

conn, addr = sk.accept()

res = check_conn(conn)
if res:
    print(‘合法的客户端‘)
    conn.send(b‘OK‘)
else:
    print(‘不合法的客户端‘)
    conn.send(b‘NO‘)

conn.close()
sk.close()

  

  客户端

import socket
import hmac

secret_key = b‘egg‘

sk = socket.socket()

sk.connect((‘127.0.0.1‘, 8090))

msg = sk.recv(1024)     # 得到的是的32个随机字节

h = hmac.new(secret_key, msg)   # 根据与服务端协商好的secret_key,对收到的32个随机字节进行加密,得到一个hmac对象

digest = h.digest() # 由hmac对象得到了32随机字节与secret_key加密后的密文内容

sk.send(digest) # 将密文内容发送到服务端

print(sk.recv(1024).decode(‘utf-8‘))

sk.close()

原文地址:https://www.cnblogs.com/whylinux/p/9749883.html

时间: 2024-08-28 15:15:38

hmac检验客户端合法性的相关文章

hmac的检验客户端合法性

server端 import socket import os import hmac seret_key = b'egg' sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.listen() def check_conn(conn): msg = os.urandom(32) conn.send(msg) h = hmac.new(seret_key,msg) digest = h.digest() client_digest = conn

网络编程- socket协议小结、hmac的检验客户端合法性和socketserver模块(十)

原文地址:https://www.cnblogs.com/mys6/p/10801448.html

socketserver和socket的补充(验证客户端合法性)

一.socket的补充 1.参数 socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 参数说明: family 地址系列应为AF_INET(默认值ipv4),AF_INET6(ipv6),AF_UNIX,AF_CAN或AF_RDS. (AF_UNIX 域实际上是使用本地 socket 文件来通信) type 套接字类型应为SOCK_STREAM(默认值,tcp协议),SOCK_DGRAM(udp协议),SOCK_R

客户合法性校验(密文hamc方法)

1.import os os.urandom(num) 随机出一个num位的随机bytes 2.import hamc md5_obj = hmac.new(盐,随机字符串) r = md5_obj.digest() 拿到一个bytes的结果,也就是密文 补充:hashlib的加密 # md5_obj = hashlib.md5(sor) # md5_obj.update(r_str.encode('utf-8')) # result = md5_obj.hexdigest() #server层

SSH中文文档

SSH中文文档 SSH 一项创建在应用层和传输层基础上的安全协议,用于替代安全性差的TELNET,加密安全登陆用. SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用SSH协议可以有效防止远程管理过程中的信息泄露问题.通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗. SSH之另一项优点为其传输的数据可以是经过压缩的,所以可以加快传输的速度.SSH有很多功能,它既可以代替Telnet,又可以为FTP.POP.甚至为PPP提供一个安全的"通道"

【linux基础】16、软件包管理

一.软件包概述 1.相关概念 源码安装操作系统方式:通过宿主机安装 GPL:公布源码(c,c++) POSIX规范:Portable Operatin System (原代码)移植性 API:应用编程接口,兼容,意味开发库兼容,因此源代码可夸平台 ABI:应用二进制接口,兼容,编译后的程序可夸平台 库:就是函数\功能,可执行程序,本身不能作为程序执行的入口,但可以被调用 编译好的二进制格式 glibc:linux标准的C库 程序开发完成后要使用得经过的步骤: 预编译,编译,汇编,链接(把库文件链

Linux程序包管理

Linux程序包管理 RPM包基础 RPM YUM 编译安装 概述 Linux上的程序包管理,是我们的必备技能,本文将从三个视角:rpm.yum.源码编译来浅析Linux的程序包管理.首先,我们来看下本文的主要内容: - 程序包的命名- RPM: 程序包管理器    安装.卸载.升级.查询.校验.数据库维护      - YUM: RPM的前端程序    yum的配置文件     yum的常规操作:升级.检查.卸载.查看.包组管理     使用光盘当作本地yum仓库     yum的命令行选项及

分布式缓存系统 Memcached 状态机之网络数据读取与解析

整个状态机的基本流程如下图所示,后续分析将按该流程来进行. 接上节分解,主线程将接收的连接socket分发给了某工作线程,然后工作线程从任务队列中取出该连接socket的CQ_ITEM,开始处理该连接的所有业务逻辑.这个过程也就是上图中的第一个状态conn_listening. 而工作线程首先进入的状态就是conn_new_cmd,即为这个新的连接做一些准备工作,如清理该连接conn结构的读缓冲区等. 准备状态conn_new_cmd具体分析如下: {  <span style="font

python基础学习日志day5--hashlib模块

hashlib模块用于加密操作,代替了md5和sha模块, 主要提供SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法. # -*- coding:utf-8 -*- __author__ = 'shisanjun' import hashlib m=hashlib.md5() #使用MD5算法 m.update(b"hello") #必须加b,申明为byte m.update(b"It is me") print(m.dige