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实现登陆知乎获得个人收藏并保存为word文件
Mar 16 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
利用Django提供的ModelForm增删改数据的方法
Jan 06 Python
django的ORM模型的实现原理
Mar 04 Python
Python模块、包(Package)概念与用法分析
May 31 Python
Python Django实现layui风格+django分页功能的例子
Aug 29 Python
Django和Flask框架优缺点对比
Oct 24 Python
Tensorflow 实现分批量读取数据
Jan 04 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
python3.4中清屏的处理方法
Jul 06 Python
Python通过类的组合模拟街道红绿灯
Sep 16 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防止伪造的数据从URL提交方法
2014/06/27 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
jquery等待效果示例
2014/05/01 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
jQuery组件easyui对话框实现代码
2016/08/25 Javascript
JavaScript探测CSS动画是否已经完成的方法
2016/08/30 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
jQuery实现立体式数字滚动条增加效果
2016/12/21 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
详解Vue用cmd创建项目
2019/02/12 Javascript
Paypal支付不完全指北
2020/06/04 Javascript
Node.js API详解之 dgram模块用法实例分析
2020/06/05 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
linecache模块加载和缓存文件内容详解
2018/01/11 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
Python列表常见操作详解(获取,增加,删除,修改,排序等)
2019/02/18 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
Python3 venv搭建轻量级虚拟环境的步骤(图文)
2019/08/09 Python
python与pycharm有何区别
2020/07/01 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
2020/09/03 Python
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
家长对孩子的感言
2014/03/10 职场文书
住宅质量保证书
2014/04/29 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
社区母亲节活动总结
2015/02/10 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
sql注入教程之类型以及提交注入
2021/08/02 MySQL