0

我正在用 python 构建一个身份验证服务器,并且想知道如何完全保护两个对等方之间的连接?我看不出恶意用户如何以任何方式复制数据包并简单地分析它们,如果他了解什么是按什么顺序出现的。

接受客户端服务器模式。客户要求一个帐户。即使使用 SRP,也可以复制数据包并稍后发送以允许登录。

那么现在,如果我添加公钥 - 私钥加密,我如何将公钥相互发送而不将它们传递到未加密的通道中?

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

4

2 回答 2

3

您可以使用某种传输层安全性,只需对任何网络套接字进行 TLS/SSL 包装。

这里的所有文档

简单的客户端 SSL 加密,如下所示

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()

这里有更多例子。

此外,请确保使用最新版本的算法以避免密码不安全。

你可能想看看这些问题:

于 2013-08-05T19:19:08.663 回答
2

您要问的是通常所说的“密钥管理”的一部分。如果你用谷歌搜索这个词,你会发现很多有趣的读物。您可能会发现您的解决方案需要解决密钥管理的其他部分,例如撤销和轮换。

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

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

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

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

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

哦,你不应该创建自己的协议。有很多关于如何编写安全协议、分析现有协议以及安全属性(或缺乏安全属性)的书籍。除非您打算成为该主题的专家(这将需要多年时间和数千页的阅读),否则您应该走阻力最小的道路,只使用一个众所周知的、经过良好实践的、受人尊敬的协议来完成你需要的工作。

于 2013-08-05T19:18:06.627 回答