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引用(import)文件夹下的py文件的方法
Aug 26 Python
python实现简单的TCP代理服务器
Oct 08 Python
python清除字符串里非字母字符的方法
Jul 02 Python
Python对列表中的各项进行关联详解
Aug 15 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
python flask安装和命令详解
Apr 02 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
给ubuntu18安装python3.7的详细教程
Jun 08 Python
Python如何在windows环境安装pip及rarfile
Jun 15 Python
Python爬虫后获取重定向url的两种方法
Jan 19 Python
Python实现排序方法常见的四种
Jul 15 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程序
2006/10/09 PHP
php+mysql事务rollback&commit示例
2010/02/08 PHP
ini_set的用法介绍
2014/01/07 PHP
PHP中的socket_read和socket_recv区别详解
2015/02/09 PHP
php模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(中)
2017/06/11 PHP
javascript下给元素添加事件的方法与代码
2007/08/13 Javascript
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
jQuery限制图片大小的方法
2016/05/25 Javascript
Bootstrap编写一个在当前网页弹出可关闭的对话框 非弹窗
2016/06/30 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
mui back 返回刷新页面的实例
2017/12/06 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
如何为vue的项目添加单元测试
2018/12/19 Javascript
js module大战
2019/04/19 Javascript
详解Vue的七种传值方式
2021/02/08 Vue.js
python使用7z解压apk包的方法
2015/04/18 Python
python模块之re正则表达式详解
2017/02/03 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
Python3实现的回文数判断及罗马数字转整数算法示例
2019/03/27 Python
Python考拉兹猜想输出序列代码实践
2019/07/05 Python
django fernet fields字段加密实践详解
2019/08/12 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
Python jieba库分词模式实例用法
2021/01/13 Python
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
自动化工程专业个人应聘自荐信
2013/09/26 职场文书
高中生自我评语大全
2014/01/19 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
教师听课评语大全
2014/12/31 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
确保减税降费落地生根,用实实在在措施
2019/07/19 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
CSS 伪元素::marker详解
2021/06/26 HTML / CSS