Python 实现简单的客户端认证


Posted in Python onJuly 29, 2020

问题

你想在分布式系统中实现一个简单的客户端连接认证功能,又不想像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(c)

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 客户端认证的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
零基础写python爬虫之爬虫框架Scrapy安装配置
Nov 06 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
详解Django框架中的视图级缓存
Jul 23 Python
python字符串str和字节数组相互转化方法
Mar 18 Python
使用Python监控文件内容变化代码实例
Jun 04 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
python批量创建指定名称的文件夹
Mar 21 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
Python如何实现爬取B站视频
May 20 Python
matplotlib 多个图像共用一个colorbar的实现示例
Sep 10 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 Python
python脚本定时发送邮件
Dec 22 Python
Tensorflow使用Anaconda、pycharm安装记录
Jul 29 #Python
学python爬虫能做什么
Jul 29 #Python
Python 创建TCP服务器的方法
Jul 28 #Python
Python实现画图软件功能方法详解
Jul 28 #Python
Python绘图之柱形图绘制详解
Jul 28 #Python
Python如何定义接口和抽象类
Jul 28 #Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 #Python
You might like
使用MaxMind 根据IP地址对访问者定位
2006/10/09 PHP
PHP个人网站架设连环讲(二)
2006/10/09 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
php示例详解Constructor Prototype Pattern 原型模式
2015/10/15 PHP
yii2实现 "上一篇,下一篇" 功能的代码实例
2017/02/04 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
用jscript实现新建word文档
2007/06/15 Javascript
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
理解javascript回调函数
2014/12/28 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
nodejs使用http模块发送get与post请求的方法示例
2018/01/08 NodeJs
vscode下的vue文件格式化问题
2018/11/28 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
Django1.11配合uni-app发起微信支付的实现
2019/10/12 Python
Centos7 下安装最新的python3.8
2019/10/28 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
绝对令人的惊叹的CSS3折叠效果(3D效果)整理
2012/12/30 HTML / CSS
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
资产经营总监岗位职责范文
2013/12/01 职场文书
技校生自我鉴定
2013/12/08 职场文书
校友会欢迎辞
2014/01/13 职场文书
副厂长岗位职责
2014/02/02 职场文书
科级干部考察材料
2014/02/15 职场文书
培训研修方案
2014/06/06 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
倡议书作文
2015/01/19 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python