如何确保.Net应用程序是真的?

在客户端 – 服务器应用程序中,服务器如何知道请求来自真正的应用程序而不是来自它的篡改副本? 我还没有开发客户端和服务器应用程序。 解决方案可能是普通套接字,wcf,IIS托管或其他。

真的没有办法。 你可以要求应用程序提供的任何东西,一个流氓应用程序可以欺骗。 最终答案是您不应该信任任何客户端应用程序。 您可以信任用户,只要他们已经过身份validation,但客户端本身是100%不值得信任的。

为了完整地说明这一点,我可以通过代理服务器运行所有流量,并随意注入/删除消息。 然后你有一个合法的客户端与虚假的消息。

现在,如果您正在谈论计划在客户端上使用的库,确保它没有被篡改,那就是强大的命名程序集。 但那对你来说无济于事。

您不能“保证”您使用的是真正的客户端。 计算机中确实没有“秘密”; 只有更难以发现的事实。 有些事情可能使您的客户更有可能成为真正的交易:

  • validation。 数字签名,内部哈希和用户提供的数据都使得您正在与之交谈的内容更有可能是您认为正在与之交谈的内容。 但是,程序可能会被使用客户端程序集作为木偶的恶意软件劫持。 即使您的代码没有可公开访问的钩子,一个恶意软件或获取SkipVerification运行权限的黑客也可以反映到您的程序集中并调用私有成员。

  • 安全监控。 您创建的客户端可以定期向Windows询问当前哪些内存挂钩到其代码中。 如果有人正在倾听您的客户端或使用它,您的客户端无法识别或服务器已识别为敌对,则客户端可能会崩溃并刻录,并且服务器知道该客户端已被盗用。 这通常很难解决,但是安全程序的知识可以通过快速工作来避免安全“巡逻”,或者通过劫持客户端挂钩到Windows来询问可疑活动来帮助妥协。

  • 行为监测。 如果客户端开始发送没有意义的消息,或者不按预期发送“仍然在这里,仍然是理智的”消息,服务器可以检测到客户端出现了问题并对其进行处理可疑,要么完全忽略它,要么限制敏感数据。 同样,知道客户端应该发送什么,或者在客户端上捎带,可以允许攻击者欺骗预期的行为。

许多公司通过在每端部署数字证书(称为相互或双向身份validation)来确保客户端和服务器之间存在信任通道。 实际上不可能监视或欺骗已启用相互身份validation的应用程序之间的任何通信。

当然,这只能保护频道,但不能保护客户端应用本身。 确保客户端完全防篡改的唯一方法是使用实​​现物理安全控制来保护正在运行的应用程序(即ATM和POS机)。

我同意Hounshell的评论,因为网上的所有数据都应视为不可信。 但是,您可以采取一些措施来增加所需攻击的复杂性,并防止轻松篡改客户端,例如建议使用强名称。 Authenticode证书还可以提供防止篡改代码的保护,并确保来自特定来源的软件是真实的。

您还可以在客户端和服务器之间实现身份validation,从而身份validation基于用户只知道的数据(不写入代码)。 这避免了篡改客户端的有用性,因为如果没有必要的凭据来validation服务器,攻击者实际上无法实现太多。 要完成攻击,他们需要拦截传输中的数据,或者在用户计算机上安装一些东西(无论如何它都是游戏)。

为了保护传输中的数据免受数据侦听(中间人)攻击,您需要加密数据。 这可以通过客户端和服务器之间的SSL通信来实现,只要执行一些基本检查即可。 客户端应确保证书由受信任的根CA签名,尚未过期,并针对与所调用的URL匹配的URL发出。

您无法远程validation应用程序。

您可以对用户进行身份validation,并且可以防止中间人攻击。 但是,如果您认为经过身份validation的用户自己是敌对的并且可能会篡改应用程序,那么就没有办法阻止这种情况发生。

最好的办法是validation所有输入,保留服务器上运行的关键部分,记录每个经过身份validation的用户的所有活动,并尽可能限制用户可能对系统造成的损害。