更多编程教程请到:菜鸟教程 https://www.piaodoo.com/

友情链接:

高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.op-kg.com/

问题

你想在分布式系统中实现一个简单的客户端连接认证功能,又不想像SSL那样的复杂。

解决方案

可以利用 hmac 模块实现一个连接握手,从而实现一个简单而高效的认证过程。下面是代码示例:

import hmac
import os

def client_authenticate(connection, secret_key):
‘’’
Authenticate client to a remote service.
connection represents a network connection.
secret_key is a key known only to both client/server.
‘’’
message = connection.recv(32)
hash = hmac.new(secret_key, message)
digest = hash.digest()
connection.send(digest)

def server_authenticate(connection, secret_key):
‘’’
Request client authentication.
‘’’
message = os.urandom(32)
connection.send(message)
hash = hmac.new(secret_key, message)
digest = hash.digest()
response = connection.recv(len(digest))
return hmac.compare_digest(digest,response)

基本原理是当连接建立后,服务器给客户端发送一个随机的字节消息(这里例子中使用了 os.urandom() 返回值)。 客户端和服务器同时利用hmac和一个只有双方知道的密钥来计算出一个加密哈希值。然后客户端将它计算出的摘要发送给服务器, 服务器通过比较这个值和自己计算的是否一致来决定接受或拒绝连接。摘要的比较需要使用 hmac.compare_digest() 函数。 使用这个函数可以避免遭到时间分析攻击,不要用简单的比较操作符(==)。 为了使用这些函数,你需要将它集成到已有的网络或消息代码中。例如,对于sockets,服务器代码应该类似下面:

from socket import socket, AF_INET, SOCK_STREAM

secret_key = b’peekaboo’
def echo_handler(client_sock):
if not server_authenticate(client_sock, secret_key):
client_sock.close()
return
while True:

msg = client_sock.recv(8192)
if not msg:break
client_sock.sendall(msg)

def echo_server(address):
s = socket(AF_INET, SOCK_STREAM)
s.bind(address)
s.listen(5)
while True:
c,a = s.accept()
echo_handler©

echo_server((’’, 18000))

Within a client, you would do this:

from socket import socket, AF_INET, SOCK_STREAM

secret_key = b’peekaboo’

s = socket(AF_INET, SOCK_STREAM)
s.connect((‘localhost’, 18000))
client_authenticate(s, secret_key)
s.send(b’Hello World’)
resp = s.recv(1024)

讨论

hmac 认证的一个常见使用场景是内部消息通信系统和进程间通信。 例如,如果你编写的系统涉及到一个集群中多个处理器之间的通信, 你可以使用本节方案来确保只有被允许的进程之间才能彼此通信。 事实上,基于 hmac 的认证被 multiprocessing 模块使用来实现子进程直接的通信。

还有一点需要强调的是连接认证和加密是两码事。 认证成功之后的通信消息是以明文形式发送的,任何人只要想监听这个连接线路都能看到消息(尽管双方的密钥不会被传输)。

hmac认证算法基于哈希函数如MD5和SHA-1,关于这个在IETF RFC 2104中有详细介绍。

以上就是Python 实现简单的客户端认证的详细内容,更多关于Python 客户端认证的资料请关注菜鸟教程www.piaodoo.com其它相关文章!

Python 实现简单的客户端认证相关推荐

  1. python能做哪些客户端_Python 实现简单的客户端认证

    问题 你想在分布式系统中实现一个简单的客户端连接认证功能,又不想像SSL那样的复杂. 解决方案 可以利用 hmac 模块实现一个连接握手,从而实现一个简单而高效的认证过程.下面是代码示例: impor ...

  2. python创建简单的客户端和服务器

    TCP客户端 import socket target_host="www.baidu.com" target_port=80 client=socket.socket(socke ...

  3. 利用python发送邮件_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

  4. python实现邮件客户端_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

  5. 计算机网络 简单FTP客户端软件的实现

    一.原理概述 1.1 FTP原理概述 文件传送协议FTP(File Transfer Protocol)是TCP/IP体系的一个重要协议,它采用Internet标准文件传输协议FTP的用户界面,向用户 ...

  6. SpringCloud(第 051 篇)EurekaServer集群高可用注册中心以及简单的安全认证

    SpringCloud(第 051 篇)EurekaServer集群高可用注册中心以及简单的安全认证 - 一.大致介绍 1.前面章节分析了一下 Eureka 的源码,我们是不是在里面注意到了 Peer ...

  7. postgresql 数据库 客户端认证

    简介 当客户端与数据库服务器连接时,它需要指定用哪个数据库用户的身份来连接. PostgreSQL 为我们提供了很多种客户端认证的方式,我们可以根据自己的需要来选择认证方式. psql psql 是 ...

  8. python16进制字节序_第 1 章 套接字、IPv4和简单的客户端/服务器编程

    第 1 章 套接字.IPv4和简单的客户端/服务器编程 本章攻略: 打印设备名和IPv4地址 获取远程设备的IP地址 将IPv4地址转换成不同的格式 通过指定的端口和协议找到服务名 主机字节序和网络字 ...

  9. python之路----验证客户端合法性

    验证客户端链接的合法性 import os import hmac import socket secret_key = b'egg' sk = socket.socket() sk.bind(('1 ...

最新文章

  1. 移动界面控件Essential Studio for Mobile MVC图表控件解析
  2. 数据采集与网站统计实现全过程
  3. 【实例讲解】JS中形参、实参可以不一致
  4. 常犯的18个统计学错误, 避坑防雷指南!
  5. 我回答的一个粉丝关于模拟SAP事务的问题
  6. 电源模块质量好不好,看看以下5点就知道了!
  7. linux go 安装路径,在Alpine Linux D的路径中找不到已安装的Go二进制文件
  8. java音频采样_音频重采样的坑
  9. 自然语言处理之TF-IDF
  10. SQL Server中的查询优化技术:提示和技巧
  11. 机器学习之判别/生成模型小结
  12. 【转】Linux配置使用SSH Key登录并禁用root密码登录
  13. arduino mega针脚_Arduino MEGA中文数据手册
  14. 015-lissajous server
  15. 【大数据科普系列之二】大数据运维工程师
  16. 抖音上热门?这几个一定要记住
  17. Java发送网易企业邮箱邮件
  18. python 找对称数
  19. 常见js手撕题及算法总结
  20. vue--百度地图之离线地图--大量标注点造成卡顿问题--海量点聚合性能优化

热门文章

  1. python使用pd.to_numeric()方法将数据转为数字类型int或float
  2. h0043. 奇怪的汉诺塔
  3. 晏几道 天涯 青砚1989
  4. 华师大计算机基础在线作业,华东师范大学计算机作业答案
  5. matplotlib系列-plt.axis
  6. Git与Github入门资料
  7. 终极大招~pycharm自动补全opencv代码提示功能
  8. “(CRON) info (No MTA installed, discarding output)”
  9. Windows 10 离线安装.NET Framework 3.5(包括.NET 2.0和3.0)
  10. WPS之Excel表格如何设置下拉选项