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入门及进阶笔记 Python 内置函数小结
Aug 09 Python
介绍Python中的一些高级编程技巧
Apr 02 Python
Python探索之静态方法和类方法的区别详解
Oct 27 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
Django实现全文检索的方法(支持中文)
May 14 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
python实现键盘输入的实操方法
Jul 16 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
python反转列表的三种方式解析
Nov 08 Python
Django实现内容缓存实例方法
Jun 30 Python
完美处理python与anaconda环境变量的冲突问题
Apr 07 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过滤危险html代码的函数
2008/07/22 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
实现PHP中session存储及删除变量
2018/10/15 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
js实现跟随鼠标移动且带关闭功能的图片广告实例
2015/02/26 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
jQuery实现移动端手机商城购物车功能
2016/09/24 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
mui开发中获取单选按钮、复选框的值(实例讲解)
2017/07/24 Javascript
详解vue 项目白屏解决方案
2018/10/31 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
nestjs返回给前端数据格式的封装实现
2021/02/22 Javascript
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
在django view中给form传入参数的例子
2019/07/19 Python
python视频按帧截取图片工具
2019/07/23 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
python数据库开发之MongoDB安装及Python3操作MongoDB数据库详细方法与实例
2020/03/18 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
HTML5地理定位与第三方工具百度地图的应用
2016/11/17 HTML / CSS
Bata印度官网:源自欧洲舒适鞋履品牌
2020/01/30 全球购物
高中毕业自我鉴定范文
2013/10/02 职场文书
后勤人员自我鉴定
2013/10/20 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
骨干教师考核方案
2014/05/09 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
小学校长个人总结
2015/03/03 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书