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中使用SAX解析xml实例
Nov 21 Python
Python实现建立SSH连接的方法
Jun 03 Python
python处理二进制数据的方法
Jun 03 Python
浅述python中argsort()函数的实例用法
Mar 30 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
Aug 08 Python
python利用sklearn包编写决策树源代码
Dec 21 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
Jan 10 Python
Django实现学生管理系统
Feb 26 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
python Qt5实现窗体跟踪鼠标移动
Dec 13 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
使用Python拟合函数曲线
Apr 14 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
探讨捕获php错误信息方法的详解
2013/06/09 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
javascript开发随笔二 动态加载js和文件
2011/11/25 Javascript
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
基于jQuery实现中英文切换导航条效果
2016/09/18 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
JS通用方法触发点击事件代码实例
2020/02/17 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
使用py2exe在Windows下将Python程序转为exe文件
2016/03/04 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
PHP如何自定义函数
2016/09/16 面试题
医院实习接收函
2014/01/12 职场文书
保险公司开门红口号
2014/06/21 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
作风转变年心得体会
2014/10/22 职场文书
消防演习通知
2015/04/25 职场文书
2015学校年度工作总结
2015/05/11 职场文书
工作服管理制度范本
2015/08/06 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL