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列表去重方法
Jan 17 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
Python实现的堆排序算法示例
Apr 29 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
Jun 28 Python
Python面向对象之反射/自省机制实例分析
Aug 24 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
Python3.5常见内置方法参数用法实例详解
Apr 29 Python
python 三元运算符使用解析
Sep 16 Python
JupyterNotebook设置Python环境的方法步骤
Dec 03 Python
python实现程序重启和系统重启方式
Apr 16 Python
python3.4中清屏的处理方法
Jul 06 Python
使用numpy nonzero 找出非0元素
May 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
法国:浪漫之都的咖啡文化
2021/03/03 咖啡文化
强烈推荐:php.ini中文版(1)
2006/10/09 PHP
NOT NULL 和NULL
2007/01/15 PHP
pw的一个放后门的方法分析
2007/10/08 PHP
PHP编码转换
2012/11/05 PHP
ThinkPHP快速入门实例教程之数据分页
2014/07/01 PHP
php实现的SESSION类
2014/12/02 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
js简单实现根据身份证号码识别性别年龄生日
2013/11/29 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
谈谈target=_new和_blank的不同之处
2016/10/25 Javascript
Vue如何引入远程JS文件
2017/04/20 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
2017/06/19 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
用python读写excel的方法
2014/11/18 Python
python smtplib模块发送SSL/TLS安全邮件实例
2015/04/08 Python
python学习之编写查询ip程序
2016/02/27 Python
python的socket编程入门
2018/01/29 Python
python查看数据类型的方法
2019/10/12 Python
Django1.11自带分页器paginator的使用方法
2019/10/31 Python
浅谈python处理json和redis hash的坑
2020/07/16 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
斯洛伐克香水和化妆品购物网站:Parfemy-Elnino.sk
2020/01/28 全球购物
贷款委托书范本
2014/04/08 职场文书
车间主任岗位职责
2015/02/03 职场文书
2015年新农合工作总结
2015/03/30 职场文书
二胎满月酒致辞
2015/07/29 职场文书
获奖感言一句话
2015/07/31 职场文书
pytorch 如何使用batch训练lstm网络
2021/05/28 Python
opencv 分类白天与夜景视频的方法
2021/06/05 Python