我有一个服务器应用程序和一个用java创建的客户端应用程序,它将与服务器应用程序通信。但是,由于我没有强调服务器端的安全性,如果黑客创建自己的客户端来连接我的服务器,那么很容易破解服务器应用程序。我想确保与我的服务器通信的客户端应用程序是我创建的可信客户端。我将客户端上传到特定主机,如www.abcd.com。现在,我可以确定连接到我的服务器的客户端何时来自该主机。我知道如何与可信赖的签名者签署,但我正在寻找一个便宜的选择。
答案 0 :(得分:2)
不,这是不可能的。如果是这样,DRM会起作用,但是每个人都知道它已经无可救药地被打破了。
为了真正安全,客户端必须是具有“可信平台模块”的计算机,TPM,支持称为远程证明的东西。这允许服务器验证客户端是否真实且未经更改。但我从来没有听说过这个真实世界的应用程序,虽然TPM很常见,但我不确定远程认证功能是否正常。
答案 1 :(得分:0)
我想确保与我的服务器通信的客户端应用程序是我创建的可信客户端。
您有两种选择。一个是密码或共享密钥,另一个是客户端证书。 SSL / TLS支持这三种方式。查找TLS-SRP(基于密码的身份验证密钥交换),TLS_PSK(基于分组密码的预共享密钥),以及具有客户端证书的传统SSLTLS密码。
您甚至可以仅使用服务器身份验证设置隧道,然后在应用程序级别执行客户端身份验证。这是Web应用程序中经常发生的情况。但这有一些非平凡的缺陷,因为它不提供相互身份验证并且缺少通道绑定。您最好使用TLS-SRP,TLS-PSK或客户端证书。
编辑:我专注于SSL / TLS,因为您引用了主机名,但您也可以在其他层执行此操作。例如,您可以在VPN级别使用共享机密和证书。 @erickson提供了一种使用TPM的方法,可以在应用程序级别使用。
现在,我可以确定连接到我的服务器的客户端何时来自该主机....主机如www.abcd.com
如果DNS配置且值得信赖,这将有效。也就是说,您必须提取主机名,执行反向查找,然后验证IP地址。我相信这称为基于网络的身份验证。
如果攻击者控制DNS或与服务器位于同一个LAN网段,那么我认为基于网络的身份验证存在一些非常重要的安全缺陷。
无论如何,HSM和TPM都不是答案。要了解原因,请参阅Peter Gutmann的Engineering Security和无人值守密钥存储部分。从他的书中可以看出:
TPM不起作用,因为他们所能做的就是存储固定密钥 这是解密其他密钥所需要的(TPM只是改变用途 智能卡,没有马力执行任何更多 而不是轻量级加密自己,所以你无法卸载整体 对它们进行加密处理),以及从无人值守的操作 他们必须在没有输入密码的情况下释放他们的秘密 只提供一个间接的明文密钥存储。