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

Fab*_*hau 5 python security connection end-to-end

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

在 python 中执行此操作的最佳方法是什么,以便它的标准得到补充,并且我可以轻松地与用不同语言重新实现的同行进行交流。

可以假设对等方事先知道彼此的 ip/端口,并且还知道彼此的 secp256k1 ECDSA 公钥,一旦建立连接,可以使用该公钥进行身份验证。

需要明确的是,我需要连接的两端。等待连接的对等点和发起连接的对等点的代码。

Tor*_*xed 6

我会在技术上尽可能正确地回答这个问题,但我对所有加密字母组合的术语和记忆仍然模糊,即使我已经研究了它们多年(缺乏长期记忆导致了这个呵呵)。

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

您本身就有数据链路,最好的通信方式是什么?

套接字是最基本的方法。
如今,您拥有 websocket、套接字和各种高级通信工具,但它们都依赖于基本套接字(最有可能通过 IP+TCP 数据包)。

因此,我建议您坚持使用套接字,除非您知道正在与您交谈的同行使用特定的东西,然后坚持使用。

如何确保数据链路的安全

在大多数情况下,您希望在不降低安全性的情况下尽可能保留旧版。这意味着您可能必须坚持使用 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))
Run Code Online (Sandbox Code Playgroud)

这将您的普通未受保护的套接字包裹在一个TLSv1您和启用 HTTPS 的 Web 服务器之间的外壳中。这是保护数据层的最常见和最安全的方法之一。

微调安全数据链路

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

ssl_sock = context.wrap_socket(s, ..., ciphers=None)
Run Code Online (Sandbox Code Playgroud)

例如,... ciphers=TLS_RSA_WITH_AES_256_CBC_SHA|TLS_RSA_WITH_AES_128_CBC_SHA)如果您只想RSA AES 256允许RSA AES 127 CBC SHA参与您的通信。所有其他密码将被丢弃并且连接将中断。

当定义密码时,您会立即缩小通信的选择范围。
许多软件仍然使用旧密码,有些软件已经过时,甚至还没有更新TLSv1,甚至不知道某些密码的存在。

结论:这一切都归结为您想要与什么人通信以及他们使用什么软件。

关于国家安全局

老实说,没有真正的方法可以知道他们可以破解/破译什么,不能破译什么。
如果你想 100% 安全,要么你是一个数学天才,你发明了你自己的算法/密码,你确定他们不知道......但是......并且你不断地改变它以保持一步先。

或者您坚持使用最可能安全(且复杂)的算法。
如果我是你,我会用谷歌搜索一次记事本,并尝试按照这些思路实施一些事情。这是您最好的选择,远离渗透者使用的标准过滤技术(美国国家安全局算作其中之一)。