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 相关文章推荐
Unicode和Python的中文处理
Mar 19 Python
Python贪吃蛇游戏编写代码
Oct 26 Python
win10下python3.5.2和tensorflow安装环境搭建教程
Sep 19 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
Nov 18 Python
Python修改文件往指定行插入内容的实例
Jan 30 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
Jul 16 Python
Django框架反向解析操作详解
Nov 28 Python
python实现俄罗斯方块游戏(改进版)
Mar 13 Python
Python Socketserver实现FTP文件上传下载代码实例
Mar 27 Python
Python中生成ndarray实例讲解
Feb 22 Python
基于Python绘制子图及子图刻度的变换等的问题
May 23 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
PHP5中使用DOM控制XML实现代码
2010/05/07 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
Laravel中GraphQL接口请求频率实战记录
2020/09/01 PHP
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
JavaScript实现Excel表格效果
2020/02/07 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
python下10个简单实例代码
2017/11/15 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
Python面向对象之类和实例用法分析
2019/06/08 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
python绘图模块matplotlib示例详解
2019/07/26 Python
Python中函数的返回值示例浅析
2019/08/28 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
毕业生如何写自荐信
2014/03/26 职场文书
单位婚育证明范本
2014/11/21 职场文书
驾驶员管理制度范本
2015/08/06 职场文书
安全主题班会教案
2015/08/12 职场文书
中学校园广播稿
2015/08/18 职场文书
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL
DIY胆机必读:各国电子管评价
2022/04/06 无线电