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中的List转化成dictionary
Aug 15 Python
20招让你的Python飞起来!
Sep 27 Python
python构建自定义回调函数详解
Jun 20 Python
python读文件保存到字典,修改字典并写入新文件的实例
Apr 23 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
Django开发中的日志输出的方法
Jul 02 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
Python实战购物车项目的实现参考
Feb 20 Python
Python面向对象程序设计类的多态用法详解
Apr 12 Python
python 字典操作提取key,value的方法
Jun 26 Python
python使用装饰器作日志处理的方法
Jul 11 Python
深入了解Python 变量作用域
Jul 24 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 常用类整理
2009/12/23 PHP
防止用户利用PHP代码DOS造成用光网络带宽
2011/03/01 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
php stripslashes和addslashes的区别
2014/02/03 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
php发送邮件的问题详解
2015/06/22 PHP
ThinkPHP安装和设置
2015/07/27 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
javascript静态的url如何传递
2007/05/03 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
学习JavaScript设计模式(链式调用)
2015/11/26 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
jQuery实现评论模块
2020/08/19 jQuery
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
Python实现读取Properties配置文件的方法
2018/03/29 Python
Python 类的特殊成员解析
2018/06/20 Python
Python2与Python3的区别实例分析
2019/04/11 Python
Python单元和文档测试实例详解
2019/04/11 Python
python 列表推导式使用详解
2019/08/29 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
美国女孩服装购物网站:Justice
2017/03/04 全球购物
家长对老师的感言
2014/03/11 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
师德师风事迹材料
2014/12/20 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书