2

基本问题
我如何知道发送我的服务消息的是我的可公开访问(客户端)应用程序?我怎么知道冒充我的应用程序的不是其他应用程序?

一些背景
目前我们通过 log4net 和 WCF 将我们网站上发生的所有错误记录到数据库中。这很有效,因为 Web 服务器(可从 Web 访问 - 部分受信任)通过受信任的关系向应用程序服务器上运行的 WCF 服务报告错误(无法从 Web 访问 - 受信任)。因此,我们知道所有错误日志都是真实的,我们需要对其进行调查。

通过我们的新网站,我们计划利用 SilverLight 让事情变得活跃一点。我们面临的问题是如何将错误从运行在 Web 消费者 PC(不受信任)上的 SilverLight 应用程序报告回我们的应用程序服务器(无法从 Web 访问 - 受信任)。

我们可以通过让客户端通过 Web 服务器上的服务门面进行通信来解决应用服务器的不可访问问题,这样就不用担心了。当我们需要确保发送消息的应用程序确实是我们的应用程序而不仅仅是一个模仿者时,就会出现问题。

一些想法
代码将用C#编写并在客户端 PC 上本地运行的SilverLight应用程序中运行,因此我们不能保证它不会被反编译并用于向我们的服务发送虚假消息。

以上意味着我们不能使用传统的对称加密,因为我们不能将我们的私钥存储在应用程序中(它可以被反编译)。同样,我们不能使用非对称加密,因为它可能只是被冒充(攻击者可以使用存储的公钥签署消息并发送它们 - 消息看起来是真实的)

在这个应用程序的情况下,没有用户身份验证,所以我们不能用它来为我们提供信任。

是的,我知道这很奇怪,因为错误日志比应用程序显示的数据受到更好的保护,但事实就是这样 :)

任何想法或帮助将不胜感激!

4

3 回答 3

3

不可能的。

您可以对用户进行身份验证,但不能对应用程序进行身份验证。

假设您决定对应用程序进行数字签名。然后,您的客户端应用程序会在运行时读取此签名,并根据此签名检查其自己的可执行二进制文件。没有什么可以阻止对手从您的应用程序中简单地删除此检查。

即使您几乎不可能对您的应用程序进行逆向工程,对手也总是可以查看通信渠道并编写一个看起来从您的客户端到您的服务器无法区分的冒名顶替者。

您唯一能做的就是根据用户身份验证服务器上的操作。

于 2009-07-16T16:52:40.337 回答
1

据推测,您的服务器正在创建 Silverlight 应用程序所在的网页。您可以创建一个只有该网页包含的短期临时“密钥”。当 Silverlight 应用程序启动时,它会读取并使用此密钥。因为服务器本身有一个不断变化的、非常短的允许密钥列表,您可以更加确定只有您的应用程序在访问您的服务。

于 2009-07-16T16:56:26.943 回答
1

在这件事上对您的最佳建议是聘请安全专家来帮助您。这不是一个独特或不寻常的问题——考虑任何试图确定它是在与真实客户还是欺诈客户交谈的游戏(例如 WoW)。即使付出了巨大的努力(查看暴雪守望者,我不会在这里链接它),他们仍然有问题。问题归结为您的攻击者将投入多少时间和精力来阻止您对他施加压力的企图。只要确保验证服务器端的所有内容。:)

于 2009-07-16T17:07:11.400 回答