python能做哪些客户端_Python 实现简单的客户端认证

问题

你想在分布式系统中实现一个简单的客户端连接认证功能,又不想像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 客户端认证的资料请关注脚本之家其它相关文章!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程并发如何高效实现生产者/消费者?

【导读】无需引入第三方消息队列组件,我们如何利用内置C#语法高效实现生产者/消费者对数据进行处理呢?在.NET Core共享框架(Share Framework)引入了通道(Channel),也就是说无需额外通过NuGet包安…

c++牛客网面试题05. 替换空格

class Solution{public:string replaceSpace(string s){int count0,len s.size();//统计空格的个数for(char c : s){if(c )count;} s.resize(len 2 * count);//修改字符串的长度for(int i len-1, j s.size()-1;i<j;i--,j--) {if(s[i]! )s[j]s[i];else{s[j]0;s[j-1]2;s[j-…

js-cookie 无法设置cookie_php操作 cookie

1&#xff0c;设置cookie<?phpsetcookie(key);setcookie(key1,value1);setcookie(key2,value2,time()1*24*60*60);setcookie(key4, value4, time() 1 * 24 * 60 * 60, , , false, true); //一旦cookie的httponly为真&#xff0c;那么只能在服务端获取&#xff0c;js无法操…

.Net orm 开源项目 FreeSql 2.0.0

写在开头2018年11月头脑发热到今天&#xff0c;一晃已经两年&#xff0c;当初从舒服区走向一个巨大的坑&#xff0c;回头一看后背一凉。两年时间从无到有&#xff0c;经历数不清的日夜奋斗&#xff08;有人问花了多长时间投入&#xff0c;答案&#xff1a;全职x2 两年无休息&a…

c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符

c语言函数库——ispunct函数 判断字符是否为标点符号或特殊字符 头文件&#xff1a;#inlude <ctype.h> spunct() 函数用来检测一个字符是否为标点符号或特殊字符&#xff0c;其原型为&#xff1a; int ispunct(int c); 【参数】c 为需要检测的字符。 【返回值】若 c 为标…

js重新渲染div_前端工程师必备:从浏览器的渲染到性能优化

文章来自&#xff1a;华为云开发者社区摘要&#xff1a;本文主要讲谈及浏览器的渲染原理、流程以及相关的性能问题。问题前瞻1. 为什么css需要放在头部&#xff1f;2. js为什么要放在body后面&#xff1f;3. 图片的加载和渲染会阻塞页面DOM构建吗&#xff1f;4. dom解析完才出现…

做架构也得讲武德

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「169」篇原创敬上大家好&#xff0c;我是Z哥。今天分享一篇对「架构」这件事的随想。我想&#xff0c;做「架构」是每个热爱技术的技术人在不断追求想进入的领域。…

c++随机数函数rand()

c 语言rand()生成随机数 c语言中rand()函数生成随机数的用法&#xff1a; 详细介绍&#xff1a; (1)使用该函数首先应在开头包含头文件stdlib.h #include<stdlib.h>(C建议使用#include&#xff0c;下同) (2)在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数…

杂牌手柄模拟xboxone手柄_手机就能玩Switch游戏,蛋蛋模拟器+盖世小鸡X2手柄体验...

最近收到一个很爆炸的消息&#xff0c;国外大神开发出了EGG模拟器(蛋蛋模拟器)&#xff0c;让手机也能玩Switch游戏&#xff0c;一直垂涎Switch游戏体验的我怎么能错过呢&#xff0c;必须一探究竟。据悉&#xff0c;EGG模拟器支持100多款Switch游戏&#xff0c;而且游戏还在持续…

api-hook,更轻量的接口测试工具

前言在网站的开发过程中&#xff0c;接口联调和测试是至关重要的一环&#xff0c;其直接影响产品的核心价值&#xff0c;而目前也有许多技术方案和工具加持&#xff0c;让我们的开发测试工作更加便捷。接口作为数据传输的重要载体&#xff0c;数据格式和内容具有多样性&#xf…

C++11的for循环使用auto的新用法

C11的for循环使用auto的新用法 for(auto a:vec) { cout<<a<<" "; } #include<bits/stdc.h> using namespace std; int main() {vector<int> vec;for(int i0; i<10; i){vec.push_back(i);}for(auto a:vec){cout<<a<<" …

如何使用 C# 中的 HashSet

译文链接&#xff1a;https://www.infoworld.com/article/3586972/how-to-use-hashset-in-csharp.htmlHashSet 是一个优化过的无序集合&#xff0c;提供对元素的高速查找和高性能的set集合操作&#xff0c;而且 HashSet 是在 .NET 3.5 中被引入的&#xff0c;在 System.Collect…

python装饰器源代码_13-Python-装饰器

1、装饰器的定义 装饰器的本质就是函数&#xff0c;用来装饰其它函数&#xff0c;就是为其它函数添加附加功能。 装饰器原则如下&#xff1a; 不能修改被装饰的函数的源代码 不能修改被装饰的函数的调用方式 2、实现装饰器知识储备 函数即变量 1 defbar():2 print("in the…

算法设计与分析——分治与递归策略——hanoi问题

**汉诺塔问题&#xff1a;**古代有一个梵塔&#xff0c;塔内有三个座A、B、C&#xff0c;A座上有64个盘子&#xff0c;盘子大小不等&#xff0c;大的在下&#xff0c;小的在上&#xff08;如图&#xff09;。有一个和尚想把这64个盘子从A座移到B座&#xff0c;但每次只能允许移…

post多个参数_关于HTTP GET和POST的区别

Photo by Luca Bravo on UnsplashGET还是POST&#xff1f; 考虑将浏览器作为客户端&#xff0c;可以缓存哪种方法&#xff1f; 哪个是"安全"方法&#xff1f; 哪一个不是幂等的&#xff1f; 如果我将端点URL复制并粘贴到浏览器的地址栏中&#xff0c;然后按Enter&…

小试YARP

.net core下&#xff0c;一个轻量组反向代理库&#xff0c;由微软发起。做了一个简单的带验证的反向代理&#xff0c;应用结构如上图&#xff0c;一个验证服务&#xff0c;两个业务服务和一个YARP服务。源码https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/As…

二分法——leetcode35. 搜索插入位置

二分法的第一种写法 在左闭右闭的区间寻找target&#xff1b; 不变的量是&#xff1a;[left,right]; #include<bits/stdc.h> using namespace std; int binary_search(vector<int> &nums,int target) {int left 0;int right nums.size() - 1; //定义target…

python大鱼吃小鱼_python 游戏编程 大鱼吃小鱼

# 游戏编程&#xff1a;按照以下游戏编写一个乌龟类和鱼类&#xff0c;并尝试编写游戏。 # 假设游戏场景&#xff08;x&#xff0c;y&#xff09;为0<x<10,0<y<10 # 游戏生成1只乌龟和10只鱼 # 他们的移动方向均随机 # 乌龟的最大移动速度为2&#xff0c;它可以随机…

Entity Framework Core 5中实现批量更新、删除

本文介绍了一个在EntityFramework Core 5中不需要预先加载数据而使用一句SQL语句批量更新、删除数据的开发包&#xff0c;并且分析了其实现原理&#xff0c;并且与其他实现方案做了比较。一、背景随着微软全面拥抱开源&#xff0c;.Net开源社区百花开放&#xff0c;涌现了非常多…