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列出一个文件夹及其子目录的所有文件
Jun 30 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
Django中login_required装饰器的深入介绍
Nov 24 Python
Python+PIL实现支付宝AR红包
Feb 09 Python
Python中反射和描述器总结
Sep 23 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
Jan 08 Python
全面了解django的缓存机制及使用方法
Jul 22 Python
python实现的读取网页并分词功能示例
Oct 29 Python
python 初始化一个定长的数组实例
Dec 02 Python
Python中filter与lambda的结合使用详解
Dec 24 Python
在keras里实现自定义上采样层
Jun 28 Python
selenium3.0+python之环境搭建的方法步骤
Feb 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
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
10条php编程小技巧
2015/07/07 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
有关js的变量作用域和this指针的讨论
2010/12/16 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
javascript去除字符串左右两端的空格
2015/02/05 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
2015/08/10 Javascript
基于jQuery实现放大镜特效
2020/10/19 Javascript
HTML5游戏引擎LTweenLite实现的超帅动画效果(附demo源码下载)
2016/01/26 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
Vue.js实现网格列表布局转换方法
2017/08/25 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
微信小程序实现原生步骤条
2019/07/25 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
Python中的Descriptor描述符学习教程
2016/06/02 Python
详解python之heapq模块及排序操作
2019/04/04 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
Python中SQLite如何使用
2020/05/27 Python
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
幼教求职信
2014/03/12 职场文书
博士生导师推荐信
2014/07/08 职场文书
2014年人事专员工作总结
2014/11/19 职场文书
Python3接口性能测试实例代码
2021/06/20 Python