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使用PyV8执行javascript代码示例分享
Dec 04 Python
Python文本相似性计算之编辑距离详解
Nov 28 Python
Python实现感知器模型、两层神经网络
Dec 19 Python
对python判断是否回文数的实例详解
Feb 08 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
python文件绝对路径写法介绍(windows)
Dec 25 Python
Python基础之字符串操作常用函数集合
Feb 09 Python
Python爬取阿拉丁统计信息过程图解
May 12 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
Nov 22 Python
python 基于Apscheduler实现定时任务
Dec 15 Python
python用tkinter开发的扫雷游戏
Jun 01 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
咖啡与牛奶
2021/03/03 冲泡冲煮
Yii2 rbac权限控制操作步骤实例教程
2016/04/29 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
htm调用JS代码
2007/03/15 Javascript
JavaScript 变量基础知识
2009/11/07 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
innerText 使用示例
2014/01/23 Javascript
使用jsonp完美解决跨域问题
2014/11/27 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
js实现炫酷的左右轮播图
2017/01/18 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
vue计算属性get和set用法示例
2019/02/08 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
ubuntu中配置pyqt4环境教程
2017/12/27 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
Django model update的多种用法介绍
2020/03/28 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
工作失职检讨书范文
2014/01/16 职场文书
调解协议书
2014/04/16 职场文书
设计师求职信模板
2014/05/06 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
对照检查剖析材料
2014/09/30 职场文书
2015暑期工社会实践报告
2015/07/13 职场文书
《法国号》教学反思
2016/02/22 职场文书
浅谈Node的内存泄露问题
2022/05/06 NodeJs
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python