专业的编程技术博客社区

网站首页 > 博客文章 正文

3、认证客户端连接合法性(认证客户端和认证服务器密钥不匹配)

baijin 2024-09-01 13:17:54 博客文章 14 ℃ 0 评论

合法性验证

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2018/3/15 12:18

# @Author : CaiChangEn

# @Software: PyCharm

# 验证客户端合法性

# 服务端

from socket import *

import os,hmac

IP_ADDR=('127.0.0.1',8080)

BACKLOG=5

BUFFER_SIZE=1024

PUBLIC_KEY=b'caichangen'

def check_client(conn,buffer_size,address): # 验证合法性的函数

secret_key = os.urandom(32) # 生成32位的随机数字作为我们的密钥

res_key=hmac.new(secret_key,PUBLIC_KEY).digest() # 使用定义的PUBLIC_KEY作为对密钥加密的盐然然后使用hamc加密

conn.send(secret_key) # 将我们的随机数传输给客户端

remote_res_key=conn.recv(BUFFER_SIZE) # 每个合法性的客户端都会有我们开发者自定义的盐,此时将我们的随机数传输过去,让客户的加密,在此接收加密后的密钥

if hmac.compare_digest(res_key,remote_res_key): # 对比两个密钥是否一致

conn.send('Establish connection success'.encode('utf-8')) # 合法情况下,给客户端一个回应

msg_loop(conn,buffer_size) # 正式进入消息循环

else:

print('来自【%s】的客户端连接不合法'%address[0]) #不合法情况下,首先在服务端记录日志

conn.send('Failed to establish connection'.encode('utf-8')) # 然后给客户端一个回应,测试用,正式情况下不需要发送

conn.close() # 关闭连接

def msg_loop(conn,buffer_size): # 通信循环

while True:

try:

data=conn.recv(buffer_size).decode('utf-8')

print(data)

except Exception as error_msg:

print(error_msg)

conn.close()

break

def conn_loop(address,buffer_size,back_log): # 连接循环

TCP_SERVER=socket(AF_INET,SOCK_STREAM)

TCP_SERVER.bind(address)

TCP_SERVER.listen(back_log)

while True:

Conn,Addr=TCP_SERVER.accept()

check_client(Conn,buffer_size,address)

if __name__ == '__main__':

print(conn_loop(IP_ADDR,BUFFER_SIZE,BACKLOG))

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 2018/3/15 12:18

# @Author : CaiChangEn

# @Software: PyCharm

# 验证客户端合法性

# 客户端

from socket import *

import hmac

IP_ADDR=('127.0.0.1',8080)

BACKLOG=5

BUFFER_SIZE=1024

PUBLIC_KEY=b'caichangen'

TCP_SERVER=socket(AF_INET,SOCK_STREAM)

TCP_SERVER.connect(IP_ADDR)

secret_key=TCP_SERVER.recv(32) # 接收服务端发来的32为随机数

res_key=hmac.new(secret_key,PUBLIC_KEY).digest() # 使用盐对其加密

TCP_SERVER.send(res_key) # 将加密的结果返回给服务端

res=TCP_SERVER.recv(30).decode('utf-8') # 接收服务端返回的验证信息

print(res)

if res == 'Failed to establish connection': # 判断如果失败那么就退出,反则

exit(110)

while True:

msg=input('input msg:').encode('utf-8')

if not msg:continue

TCP_SERVER.send(msg)

TCP_SERVER.close()

原理

实现方式其实很简单,就是在服务端和客户端直接交互之前,首先

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表