问题

你想在分布式系统中实现一个简单的客户端连接认证功能,又不想像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 实现简单的客户端认证相关推荐

  1. python可以做什么开发-python适合做什么开发_python未来发展怎么样

    python概述 Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年.Python是纯粹的自由软件, 源代 ...

  2. python能做什么脚本_Python能做什么

    Python 作为一种功能强大的编程语言,因其简单易学而受到很多开发者的青睐.那么,Python 的应用领域有哪些呢? 概括起来,Python 的应用领域主要有如下几个. Web应用开发 Python ...

  3. python最适合做什么-python适合做什么开发_python未来发展怎么样

    python概述 Python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年.Python是纯粹的自由软件, 源代 ...

  4. python能做机器人吗_python深度学习 人工智能是做机器人吗?

    我们经常听到"Python"与"人工智能"这两个词, 也很容易混淆这两个词, 那么Python和人工智能到底什么关系呢? Python人工智能工程师待遇怎么样? ...

  5. 使用Python来做物联网,就是这么简单!

    搭建整套物联网系统的方法有很多,最近四处捣鼓,使用python + 阿里云搭建一套最简单的物联系统,可以将单片机上的数据通过阿里云传输到PC端. 一.基本结构 先看架构图 二.设备端接入 物联网终端是 ...

  6. python能做app吗_python可以做app么

    python语言虽然很万能,但用它来开发app还是显得有点不对路,因此用python开发的app应当是作为编码练习.或者自娱自乐所用,加上目前这方面的模块还不是特别成熟,bug比较多,总而言之,劝君莫 ...

  7. python编程超市购物系统_python实现简单购物车系统(练习)

    #!Anaconda/anaconda/python#coding: utf-8 #列表练习,实现简单购物车系统 product_lists= [('iphone',5000), ('computer ...

  8. 用python做一个木马_Python编程简单的木马程序(转载于乌云中)

    Python编程简单的木马程序 light·2015/01/26 10:07 0x00准备好了 本文的内容仅用于研究和研究,不得用于非法目的! 这一次,我们使用Python编写了一个简单的木马,它具有 ...

  9. python做图片美化_Python实现简单的照片磨皮(照片智能磨皮) 最新免费版

    Python实现简单的照片磨皮(照片智能磨皮)是一款用python写的最好的照片磨皮软件.需要配置opencv和numpy,使用的时候地址需要加英文的引号,斜杠要用双斜杠,例如"D:\\a. ...

最新文章

  1. Gartner:为什么元宇宙商业离我们还很遥远?
  2. 前端神器—Google Chrome Devtools细节详解
  3. iqueryable怎么进行操作_C# 数据操作系列 - 16 SqlSugar 完结篇(最后的精华)
  4. Oracle优化06-Hint
  5. C++中的类模板详细讲述
  6. SAP中各种分摊分配方法
  7. 使用JDBCTemplate实现与Spring结合,方法公用 ——Emp实现类(EmpDaoImpl)
  8. android json 解析图片,JSON解析并获取android中的图像
  9. C++Primer学习之一引用和指针
  10. 数字逻辑之组合逻辑电路
  11. windows mysql 自动备份_windows mysql 自动备份的几种方法总结--岁月博客提供
  12. 高并发、高访问量如何计算【测试评估】
  13. cat6 万兆_CAT6、CAT6A超六类和CAT7七类网线哪个更适合10GBASE-T万兆网络
  14. 全加器,半加器公式推演
  15. 数据库系统原理学习笔记三(关系数据模型的组成要素)
  16. 星巴克中国虎年新春限定产品上市
  17. 磁场传感器(指北针)
  18. Notability work with acrobat pro dc
  19. 使用USBWriter做U盘启动盘后U盘在盘中不显示的解决办法(轉載)
  20. 量化交易中,如何使用Python画K线、成交量、买卖点【邢不行】

热门文章

  1. java 画砖块,钢笔画入门:教你画砖块
  2. 个人中心的html,个人中心.html
  3. 利用Excel VBA批量计算长时间序列植被物候动态阈值(逐像元)
  4. linux之用echo输入数据到文本末尾以及用open ssl命令在证书文件里面获取公钥
  5. Android之INSTALL_FAILED_UPDATE_INCOMPATIBLE(pacakge:...do not match the previously installed version)
  6. ios之Xcode工程中添加文件常用快捷键
  7. sqlite数据库备份还原、导出导入
  8. 华为交换机查看端口流量_华为交换机限速及流量统计配置
  9. 中yeti不能加载_将 PQ 查询加载到 Excel 中进行分析的三种常用的方式
  10. 未检测到正确安装的网络适配器_电脑网络适配器有感叹号怎么解决?