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和C++求解方法
Aug 20 Python
Python的自动化部署模块Fabric的安装及使用指南
Jan 19 Python
python爬虫 正则表达式使用技巧及爬取个人博客的实例讲解
Oct 20 Python
Python实现自动发送邮件功能
Mar 02 Python
Django 实现下载文件功能的示例
Mar 06 Python
Python基础教程之利用期物处理并发
Mar 29 Python
python 动态迁移solr数据过程解析
Sep 04 Python
Python socket模块方法实现详解
Nov 05 Python
tensorflow使用指定gpu的方法
Feb 04 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 Python
django 装饰器 检测登录状态操作
Jul 02 Python
用python实现监控视频人数统计
May 21 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针对字符串开头和结尾的判断方法
2016/07/11 PHP
PHP 断点续传实例详解
2017/11/11 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
js实现图片轮换效果代码
2013/04/16 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
2013/12/12 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
Python实现从订阅源下载图片的方法
2015/03/11 Python
使用python实现knn算法
2017/12/20 Python
Python开发的十个小贴士和技巧及长常犯错误
2018/09/27 Python
用python打印菱形的实操方法和代码
2019/06/25 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
Python基于os.environ从windows获取环境变量
2020/06/09 Python
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
催款函范文
2015/06/24 职场文书
驻村工作简报
2015/07/20 职场文书
2019交通安全宣传标语集锦!
2019/06/28 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
Redis分布式锁Redlock的实现
2021/08/07 Redis
MySQL数据库中的锁、解锁以及删除事务
2022/05/06 MySQL
React自定义hook的方法
2022/06/25 Javascript