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中subprocess的简单使用示例
Jul 28 Python
Python在线运行代码助手
Jul 15 Python
详解python的数字类型变量与其方法
Nov 20 Python
python调用百度REST API实现语音识别
Aug 30 Python
python框架django项目部署相关知识详解
Nov 04 Python
通过 Django Pagination 实现简单分页功能
Nov 11 Python
关于ZeroMQ 三种模式python3实现方式
Dec 23 Python
Pycharm小白级简单使用教程
Jan 08 Python
Python计算IV值的示例讲解
Feb 28 Python
从0到1使用python开发一个半自动答题小程序的实现
May 12 Python
python中pow函数用法及功能说明
Dec 04 Python
python flask框架快速入门
May 14 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自定义大小验证码的方法详解
2013/06/07 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
PHP生成条形码大揭秘
2015/09/24 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
js控制容器隐藏出现防止样式变化的两种方法
2014/04/25 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
详解组件库的webpack构建速度优化
2018/06/18 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
2019/06/18 jQuery
Python的ORM框架SQLAlchemy入门教程
2014/04/28 Python
Python检测字符串中是否包含某字符集合中的字符
2015/05/21 Python
Python中的id()函数指的什么
2017/10/17 Python
Python时间戳使用和相互转换详解
2017/12/11 Python
python生成tensorflow输入输出的图像格式的方法
2018/02/12 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
mac下如何将python2.7改为python3
2018/07/13 Python
python版大富翁源代码分享
2018/11/19 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
python文件和文件夹复制函数
2020/02/07 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
如何使用Python处理HDF格式数据及可视化问题
2020/06/24 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
《在山的那边》教学反思
2014/02/23 职场文书
英语分层教学实施方案
2014/06/15 职场文书