c# - 如何验证客户端应用程序以信任从其发送的消息

标签 c# silverlight authentication trust

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

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

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

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

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

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

在此应用程序中,没有用户身份验证,因此我们无法使用它来为我们提供信任。

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

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

最佳答案

不可能。

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

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

即使您几乎不可能对您的应用程序进行逆向工程,对手也始终可以查看通信 channel 并编写一个看起来与您的客户端到您的服务器没有区别的冒名顶替者。

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

关于c# - 如何验证客户端应用程序以信任从其发送的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1138831/

相关文章:

c# - 后台 worker 没有停止

c# - 调用 View 并等到窗口关闭在 MVVM 中可行吗?

c# - 如何删除 Entity Framework Core 中的多行?

python - G Suite SSO,仅限于公司账户,在 Python 和 Flask 中?

python - 将配置文件模型连接到远程用户(自定义身份验证后端)

scala - 如何在查找中隐藏 Akka 远程 Actor ?

c# - 线程、复制、错误、SetTextCallback

silverlight - 您如何调试 Share Picker 扩展?

c# - Silverlight:值不在预期范围异常之内

silverlight - Silverlight:图像到字节[]