假设我有一台服务器正在侦听端口1234.我有一些客户端软件需要能够连接到这个端口。但我希望防止恶意用户绕过客户端软件并通过其他方式(例如在控制台或其他软件中)连接到端口。
如果需要,可信客户端软件和服务器可以共享密钥。我不希望以明文形式发送这样的密钥,但是认证后的数据可以是纯文本。具体来说,我正在试图找出如何打败中间人攻击,其中恶意用户正在使用可信客户端软件来计算对服务器挑战的正确响应。
我可以从这里到达那里吗?
我可以让服务器的监听端口仅绑定到localhost,并要求客户端首先通过ssh访问该计算机。然后客户端软件可以使用ssh库在连接到本地端口的服务器上运行命令(在这种情况下,恶意用户将无法使用ssh访问该计算机,因为他没有密码)。但随后我的所有流量都被加密,这是额外的开销。也许有一个类似于ssh的程序只能进行身份验证,但之后会以纯文本形式留下通道?
我运行了一项测试,以确定与加密所有流量相关的开销。
spew.rb输出1000万个100个字符的行。
CONTROL:
fantius@machine> time /home/fantius/spew.rb > /dev/null
real 0m35.015s
user 0m34.934s
sys 0m0.084s
top显示25%的cpu使用率(一个完整核心,四个核心)
TEST:
fantius@machine> time ssh localhost /home/fantius/spew.rb > /dev/null
real 0m40.704s
user 0m19.981s
sys 0m1.400s
top显示45%的cpu使用率(几乎两个完整核心)
因此,我无法购买加密所有内容的成本最低的论点。当然,这是一项非常重要的数据测试。
答案 0 :(得分:0)
您为保护链接所做的任何事情都可以/将被破坏。您可以使用SSL来防止链接被嗅探,您可以在应用程序中嵌入密钥。但是那些密钥掌握在用户手中并且可以被提取(无论你多么努力地隐藏它们)。最多可以让恶意用户“难以”模仿/替换/绕过您的远程应用程序。你永远不可能让它变得不可能。
SSL开销很小 - 初始握手的开销通常高于以后实际传输数据的开销。如果你保持链接打开,那么握手开销就变成了一次性的事情而且在长时间的会话中是无关紧要的。如果重新协商密钥,偶尔会有一些开销,但同样,在长期链接上,它是最小的。
至于中间人,你可以做的很少。银行已经遇到了足够的麻烦,因为特洛伊木马干扰了人们的账户。如果有人在中间,他们可以做任何他们想要的事情。通过足够的监控,他们可以复制整个通信协议并复制您的应用程序。