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来使用七牛云存储的方法详解
Aug 07 Python
Python和JavaScript间代码转换的4个工具
Feb 22 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
python中通过预先编译正则表达式提高效率
Sep 25 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
Python数据类型之Set集合实例详解
May 07 Python
python 动态迁移solr数据过程解析
Sep 04 Python
numpy.linalg.eig() 计算矩阵特征向量方式
Nov 29 Python
Scrapy框架实现的登录网站操作示例
Feb 06 Python
详解python itertools功能
Feb 07 Python
django 前端页面如何实现显示前N条数据
Mar 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中GET变量的使用
2006/10/09 PHP
PHP类中Static方法效率测试代码
2010/10/17 PHP
PHP 无限分类三种方式 非函数的递归调用!
2011/08/26 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
javascript[js]获取url参数的代码
2007/10/17 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
UI Events 用户界面事件
2012/06/27 Javascript
js获得网页背景色和字体色的方法
2014/03/21 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
jQuery实现转动随机数抽奖效果的方法
2015/05/21 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
Node.js简单入门前传
2017/08/21 Javascript
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
Python2.7.10以上pip更新及其他包的安装教程
2018/06/12 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
英国家电直销:Appliances Direct
2016/09/22 全球购物
西班牙香水和化妆品连锁店:Druni
2019/05/05 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
内容编辑个人求职信
2013/12/10 职场文书
幼儿园新学期寄语
2014/01/18 职场文书
大学社团活动策划书
2014/01/26 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
最常使用的求职信
2014/05/25 职场文书
党员民主评议个人总结
2014/10/20 职场文书
2014年检验员工作总结
2014/11/19 职场文书
工作经验交流材料
2014/12/30 职场文书
2016年最美孝心少年事迹材料
2016/02/26 职场文书
JavaScript实现音乐播放器
2022/08/14 Javascript