我怎样才能完全保证两个节点之间的连接安全?

2024-05-12 03:04:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用python构建一个身份验证服务器,想知道如何才能完全保护两个对等机之间的连接?我不明白,如果一个恶意用户知道数据包的顺序是什么,他怎么就不能复制数据包并简单地分析它们。在

允许客户端-服务器架构。客户要求账户。即使是SRP,也可以复制数据包并在以后发送以允许登录。在

那么现在,如果我添加了公钥-私钥加密,如何在不通过非加密通道传递公钥的情况下相互发送呢?在

很抱歉,如果我的问题仍然没有解决,或者看起来我不关心这个问题,但是我真的很难弄清楚如何在没有几个安全漏洞的情况下建立一个身份验证过程。在


Tags: 用户服务器身份验证客户端客户顺序架构情况
2条回答

你所问的是通常所说的“密钥管理”的一部分。如果你搜索这个术语,你会发现很多有趣的阅读。您很可能会发现,您的解决方案还需要处理密钥管理的其他部分,例如吊销和轮换。在

在您正在研究的密钥管理的特定部分,您需要弄清楚如何让两个节点相互信任。这意味着您必须确定一个您信任的独立事物,节点信任的基础是它。有两种常见方法:

  1. 信任第三方。这是我们访问的大多数网站使用的模型。当我们的计算机被创建时,受信任的第三方会创建设备,使其已经知道并信任某些实体,比如Verisign。当我们通过HTTPS联系网站时,浏览器会自动检查Verisign(或另一个可信的第三方证书颁发机构)是否同意这是它声称的网站。公钥密码术的魔力以及它的工作原理是一个完全独立的主题,我建议您对此进行研究(只需google for it:)。

  2. 独立、安全的通道。在这个模型中,我们使用一个单独的通道,就像管理员将秘密从一个节点传输到另一个节点。管理员可以按照他/她希望的任何方式执行此操作,例如通过sneakernet通过U盘携带的加密数据,或者可以通过已经引导并可以验证其安全性的单独SFTP服务器传输数据(例如使用他/她自己的内部证书颁发机构)。这种方法的一些变体是共享名片上的PGP密钥(如果您相信给您名片的人是您希望与之通信的人),或者通过电话给密钥所有者打电话,口头确认您收到的数据的哈希值与他们发送的数据的哈希值相同。

有在线密钥交换协议——你可以用“密钥交换”这个短语来查找,甚至可以在维基百科上查到,但你需要注意的是,它们实际上保证了你需要确定的东西——比如协议如何对通信通道的另一端进行身份验证。例如,Diffie-Hellman保证您在没有交换密钥的实际内容的情况下交换了密钥,但是您不知道您在与谁通信—这是一个匿名密钥交换模型。在

你还提到你担心消息重播。现代安全通信协议,如SSH和TLS可以防止这种情况。任何一个好的协议都会收到关于其安全属性的分析,这些属性通常在维基百科上有很好的描述。在

哦,而且你不应该创建自己的协议。关于如何编写安全协议、分析现有协议以及这些安全属性(或缺乏安全属性)的书籍很多。除非你打算成为这方面的专家(这需要很多年和数千页的阅读),否则你应该走阻力最小的道路,只需使用一个众所周知的、充分锻炼的、受尊重的协议来完成你需要的工作。在

您可以使用某种类型的Transport Layer Security,简单地说是用于任何网络套接字的TLS/SSL包装。在

All the documentation here。在

简单的客户端SSL加密,如演示的here

import socket, ssl, pprint

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# require a certificate from the server
ssl_sock = ssl.wrap_socket(s,
                           ca_certs="/etc/ca_certs_file",
                           cert_reqs=ssl.CERT_REQUIRED)

ssl_sock.connect(('www.verisign.com', 443))

print repr(ssl_sock.getpeername())
print ssl_sock.cipher()
print pprint.pformat(ssl_sock.getpeercert())

# Set a simple HTTP request   use httplib in actual code.
ssl_sock.write("""GET / HTTP/1.0\r
Host: www.verisign.com\r\n\r\n""")

# Read a chunk of data.  Will not necessarily
# read all the data returned by the server.
data = ssl_sock.read()

# note that closing the SSLSocket will also close the underlying socket
ssl_sock.close()

More examples here.

另外,确保使用最新版本的算法,以避免加密不安全。在

你可能想看看这些问题:

相关问题 更多 >