2011-01-13 44 views
0

比方说,我有一台服务器在端口1234上侦听。我有一些客户端软件需要能够连接到此端口。但我想阻止恶意用户绕过客户端软件并通过其他方式(例如在控制台或其他软件中)连接到端口。如何以安全的方式验证客户端连接?

如果需要,受信任的客户端软件和服务器可能共享一个密钥。我不希望以明文形式发送这样的密钥,但认证后的数据可以采用明文形式。具体而言,我试图找出如何打败恶意用户使用可信客户端软件来计算服务器挑战的正确响应的中间人攻击。

我可以从这里到达吗?

我可以让服务器的侦听端口只绑定到本地主机,并要求客户端首先通过ssh获得对机器的访问权限。然后,客户端软件可以使用ssh库在连接到本地端口的服务器上运行命令(在这种情况下,恶意用户将无法使用ssh访问机器,因为他没有密码)。但后来我的所有流量都被加密了,这是额外的开销。也许有一个类似于ssh的程序只能进行身份验证,然后在那之后以纯文本的形式离开该通道?

更新:

我跑了测试,以确定与加密所有交通相关的开销。

spew.rb输出1000万个100字符的行。

CONTROL:

[email protected]> time /home/fantius/spew.rb > /dev/null 

real 0m35.015s 
user 0m34.934s 
sys  0m0.084s 

顶部示出了25%的CPU使用率(一个完整的芯,4个内核)

TEST:

[email protected]> time ssh localhost /home/fantius/spew.rb > /dev/null 

real 0m40.704s 
user 0m19.981s 
sys  0m1.400s 

顶部示出了45%的CPU使用率(近两全核心)

所以我无法购买加密所有东西的成本是最小的。当然,这是一个数据量非常大的测试。

回答

0

你所做的任何事情,以确保链接可以/将被颠覆。您可以使用SSL来防止链接被嗅探,您可以在应用中嵌入密钥。但是那些键在用户手中并且可以被提取(不管你多么努力地隐藏它们)。您最多可以让恶意用户模拟/替换/绕过您的远程应用程序。你永远无法做到不可能。

SSL开销很小 - 初次握手的开销通常比之后实际传输数据的开销要高。如果你保持链接打开,握手开销就变成了一次性的事情,并且长时间的会话无关紧要。如果密钥重新协商,偶尔会有突发的开销,但再次,在长期的链接上,它是最小的。

至于中间人,你很难做到。银行已经有足够的麻烦,因为木马使人们的账户枯竭。如果有人在中间,他们可以做任何他们想做的事情。有了足够的监控,他们可以复制整个通信协议并复制您的应用程序。

+0

如果您可以从二进制文件中提取密钥,您将获得完全访问权限 - 对此我可以。据我的理解,ssh对中间人攻击有抵抗力,至少比一个简单的系统要求客户解决服务器发出的挑战更有效。但我不知道这种额外阻力的性质。 – Fantius 2011-01-13 19:00:44