如何使用python建立安全的端到端连接

如何使用python建立安全的端到端连接,python,security,connection,end-to-end,Python,Security,Connection,End To End,我想在两个对等方之间建立一个安全的NSA证明连接,具有完美的前向保密性以及人们所期望的一切 在python中实现这一点的最佳方法是什么,这样它的标准可以得到补充,并且我可以轻松地与用不同语言重新实现的对等方进行通信 可以假设对等方事先知道彼此的ip/端口,也知道彼此的secp256k1 ECDSA公钥,该公钥可用于在建立连接后进行身份验证 我想说清楚,我需要连接的两个方面。等待连接的对等方和启动连接的对等方的代码。我将回答技术上尽可能正确的问题,但我对所有加密字母组合的术语和记忆是模糊的,即使我

我想在两个对等方之间建立一个安全的NSA证明连接,具有完美的前向保密性以及人们所期望的一切

在python中实现这一点的最佳方法是什么,这样它的标准可以得到补充,并且我可以轻松地与用不同语言重新实现的对等方进行通信

可以假设对等方事先知道彼此的ip/端口,也知道彼此的secp256k1 ECDSA公钥,该公钥可用于在建立连接后进行身份验证


我想说清楚,我需要连接的两个方面。等待连接的对等方和启动连接的对等方的代码。

我将回答技术上尽可能正确的问题,但我对所有加密字母组合的术语和记忆是模糊的,即使我已经研究了多年(缺乏长期记忆会导致这种情况)

首先,这是一个由多个部分组成的问题,并不是Python特有的。因此,我在上面作了评论

你有数据链路本身,通过它进行通信的最佳方式是什么? 插座是最基本的方法。
现在,您有WebSocket、socket和各种高级通信工具,但它们都依赖于一个基本的socket(很可能是通过IP+TCP数据包)

所以我建议你坚持使用sockets,除非你知道与你交谈的同龄人使用特定的东西,然后坚持使用sockets

如何保护数据链路 在大多数情况下,您希望在不降低安全性的情况下尽可能保留原有功能。这意味着您可能必须坚持TLS(不要…我重复一遍,不要使用SSLv*。除非您知道为什么需要,否则不要!)

Python(和其他语言)对此有很好的包装。
其中一个例子是:

import socket, ssl

context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_REQUIRED
context.check_hostname = True
context.load_default_certs()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = context.wrap_socket(s, server_hostname='www.verisign.com')
ssl_sock.connect(('www.verisign.com', 443))
这会将您的普通无保护套接字封装在您与启用HTTPS的web服务器之间的
TLSv1
机柜中。这是保护数据层最常见和最安全的方法之一

微调安全数据链路 在Python中,向套接字添加额外安全性的方法是将特定的组合传递给包装器。像这样:

ssl_sock = context.wrap_socket(s, ..., ciphers=None)
例如,
。。。密码=TLS_RSA_WITH_AES_256_CBC_SHA | TLS_RSA_WITH_AES_128_CBC_SHA)
如果您只想在通信中允许
RSA AES 256
RSA AES 127 CBC SHA
。所有其他密码将被丢弃,连接将中断

定义密码时,您可以立即缩小通信选项的范围。
许多软件仍然使用传统密码,有些软件已经过时,甚至还没有更新到
TLSv1
,甚至没有意识到某些密码的存在

结论:这一切归结为您想要与之交流的内容以及他们使用的软件

关于国家安全局 老实说,没有真正的方法知道他们能破译什么,不能破译什么。
如果你想100%安全,要么你是一个数学天才,你发明了自己的算法/密码,你确信他们不知道。。然而你不断地改变它以保持领先一步

或者您坚持使用最可能的安全(和复杂)算法。

如果我是你,我会用谷歌搜索,并尝试按照这些思路实现一些东西。这是你远离渗透者使用的标准过滤技术的最佳选择(NSA也算一种)

我认为你的问题与其说与Python有关,不如说与安全本身有关。考虑一下这个问题。你的问题可以归结为任何形式的加密,而TLS+标准套接字可能就是你想要的。我编辑了这个问题以便更清楚,我需要双方(等待连接的对等方)。这是一个点对点客户端,我控制双方,所以密码可以更严格。@fabe很好,那么我的答案仍然有效。还有一点需要注意的是,我们不是编码服务。所以我们不会为你编程。向我们展示一些尝试解决问题的努力(可能使用上述指南),我们可以帮助您解决实际的实现问题。到目前为止,您要求我们为您编写客户机和服务器代码,而我们通常不会这样做(在常见问题解答中有详细描述)。没关系,我不是要求您编写任何代码,只是要求您知道最好的libs/协议是什么。我只是想为这样一个常见的问题建立一个规范的例子,因为我找不到一个简单明了的答案。一旦我开始工作,我会自己发布代码,这样就可以检查了,因为安全性是最重要的。@fabe再次强调,我的答案仍然有效。这取决于你想把什么带过这条安全线。例如,实时视频或文本加密?Pyt是的,在Python中,最好的方法是使用socket+在其周围包装TLS。它是Python中内置的标准协议和过程,可以提供您需要的所有内容。否则我会研究隧道,特别是IPsec,因为它是IPv6中事实上的标准。这就是我用来保护我基本需求的东西。@fabe,再一次,可能更像是一个安全论坛的问题,而不是直接编程。因此,我第一次投票决定结束这个问题,尽管这个地区对我来说很重要,我喜欢编程。在本例中,您正在对最佳方法进行案例研究,而不是编程本身。您要寻找的是方法、密码和最佳实践,而不是代码atm。默认情况下,解决案例研究所需的所有库都是用Python提供的,出于安全原因,我不敢使用默认库以外的任何库(例如,Twisted,当套接字获得所需的一切时,我永远不会使用它)