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自动化构建工具scons使用入门笔记
Mar 10 Python
python中 logging的使用详解
Oct 25 Python
遗传算法python版
Mar 19 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
Jun 28 Python
很酷的python表白工具 你喜欢我吗
Apr 11 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
Python-copy()与deepcopy()区别详解
Jul 12 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
Jan 08 Python
.dcm格式文件软件读取及python处理详解
Jan 16 Python
python中Array和DataFrame相互转换的实例讲解
Feb 03 Python
pytorch 实现多个Dataloader同时训练
May 29 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 is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
几个实用的PHP内置函数使用指南
2014/11/27 PHP
php中随机函数mt_rand()与rand()性能对比分析
2014/12/01 PHP
Yii2中cookie用法示例分析
2016/07/18 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
用apply让javascript函数仅执行一次的代码
2010/06/27 Javascript
jquery实现标签上移、下移、置顶
2015/04/26 Javascript
详解Bootstrap按钮
2016/01/04 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
玩转python爬虫之正则表达式
2016/02/17 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
配置 Pycharm 默认 Test runner 的图文教程
2018/11/30 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
python 控制Asterisk AMI接口外呼电话的例子
2019/08/08 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
2020/01/13 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
CSS3实现王者匹配时的粒子动画效果
2019/04/12 HTML / CSS
亚马逊印度站:Amazon.in
2017/10/15 全球购物
Laura Geller官网:美国彩妆品牌
2018/12/29 全球购物
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
如何用PHP实现邮件发送
2012/12/26 面试题
database面试题
2013/03/28 面试题
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
记账会计岗位职责
2014/06/16 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
企业宣传稿范文
2015/07/23 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
中秋节主题班会
2015/08/14 职场文书
大学文艺委员竞选稿
2015/11/19 职场文书
浅谈为什么我的 z-index 又不生效了
2022/07/15 HTML / CSS