17

假设您有一个使用 SOAP 连接您的后端的移动应用程序(Windows Phone 或 Android)。

为了简单起见,假设我们有一个用 C# 实现的 Web 服务。服务器公开以下方法:

[WebMethod]
public string SayHallo() { return "Hallo Client"; }

从服务器的角度来看,您无法判断调用者是您的移动应用程序还是试图调试您的 Web 服务的开发人员,还是试图逆向工程/利用您的后端的黑客。

如何确定 Web 服务调用的来源是应用程序?因为任何拥有 WSDL 的人都可以调用 WS。

我知道我可以对 Web 服务实施一些标准的安全措施,例如:

  • 在服务器上实施 HTTPS,以便消息加密传输并降低窃听的危险。
  • 使用摘要/散列算法在客户端对请求进行签名,在服务器中验证签名并拒绝未正确签名的消息。
  • 在 HTTP 请求中写入自定义标头。无论如何,可以模拟标题。

但是,任何经验丰富的黑客或知道签名算法的开发人员仍然可以生成签名良好、格式化良好的消息。或者一个真正优秀的黑客可以拆解应用程序并获得我的“绝密”通信协议的隐藏知识。

任何想法如何使 SayHallo() 方法只回答从我的移动应用程序发出的请求?

我们在移动应用程序的上下文中运行,通过硬件访问,可以利用硬件功能完成一些事情。

如果有人想知道,我正在考虑如何使移动应用程序对银行等敏感应用程序足够安全。

谢谢你的想法。

4

6 回答 6

10

您所描述的是双向身份验证。它只能通过在通信双方存储签名的公钥(证书)来完成。这意味着每个应用程序都需要使用您的服务器公钥对您的服务器进行身份验证,并且服务器需要对您的应用程序的每个实例进行身份验证。应用程序的公钥将需要在部署时与应用程序的每个实例一起生成并存储在服务器上。将此视为 2 路 HTTPS,通常唯一需要完成的身份验证是一个方向,浏览器使用受信任的签名密钥对服务器进行身份验证。在您的情况下,这需要在双方都完成。通常你会有一个像 VeriSign 这样的服务签署一个公钥的每个实例,这对于一个应用程序的多个部署来说可能会变得非常昂贵。在您的情况下,您可以使用诸如 OPENSSL 之类的东西创建一个内部签名应用程序,以便在每次分发您的应用程序时对其进行签名。这并不意味着有人仍然无法破解您的代码并在应用程序端提取签名密钥。一般来说,任何代码都可能被黑客入侵,问题只是在他们放弃之前你能做到多难?如果您要走自定义硬件路线,那么加密芯片和 TMP 之类的东西可以用作密钥,使人们更难访问设备上的私钥。只是一个问题,在他们放弃之前你能做到多难?如果您要走自定义硬件路线,那么加密芯片和 TMP 之类的东西可以用作密钥,使人们更难访问设备上的私钥。只是一个问题,在他们放弃之前你能做到多难?如果您要走自定义硬件路线,那么加密芯片和 TMP 之类的东西可以用作密钥,使人们更难访问设备上的私钥。

一个快速的谷歌搜索出现了以下内容:

http://www.codeproject.com/Articles/326574/An-Introduction-to-Mutual-SSL-Authentication

如果您正在考虑使用奖励积分,并且真的担心有人从外部游戏系统,那么更好的解决方案是让每个人都创建一个安全存储在服务器上的帐户,并将他们的积分保存并在那里计算。这集中了所有数据,并允许您完全控制它,而不必担心恶意应用程序报告不存在的点。(这就是银行的运作方式)

于 2012-12-24T16:24:56.630 回答
6

如果您想验证用户既是移动用户 又是 他们所说的用户,那么最好的方法是利用网络。使用您希望用户通过以下方式使用的散列密钥发送推送通知:

于 2013-01-02T23:23:30.213 回答
2

一般来说,模型看起来像:

  • 服务器使用经过认证的公钥向许多客户端进行身份验证(这是整个公钥基础设施、证书颁发机构等)
  • 每个客户端通过其他一些身份验证系统向服务器标识自己(在 99.9% 的情况下,这是一个密码)

因此,如果您想知道在银行应用程序等情况下这种事情是如何工作的,这基本上就是它的分解方式:(1)客户端和服务器使用服务器的公钥建立一个安全通道,例如共享密钥, (2) 客户端使用其他机制通过此安全通道进行身份验证。

但是,您的具体问题似乎更针对应用程序进行身份验证(即,来自您的应用程序的任何请求都是真实的),并认为如果只有您的应用程序可以通过身份验证,并且您的应用程序表现良好,那么一切都应该是安全的. 这有几个含义:

  • 这意味着您的应用程序的每个用户都是受信任的。在安全方面,它们是您“可信计算库”的一部分。
  • 试图在不考虑用户/用户的计算平台是可信的情况下实现这种目标本质上是DRM的目标;虽然它足以为音乐出版商省钱,但对于真正敏感的东西来说,它还远远不够好。

一般来说:

  • 如果您正在寻找非常强大的安全属性,那么您特别关注的问题很难解决。
  • 你可能不需要解决这个问题。
  • 如果您给我们更多的背景信息,我们也许可以给您更具体的建议。
于 2012-12-24T16:49:59.267 回答
2

除了已经给出的答案之外,如何使用具有手机唯一 ID 和密码的登录类型方案?让用户在您的“后端”注册,每次必须在后端进行交易时,要求输入密码或选择自动登录。

于 2012-12-30T03:43:36.773 回答
2

您可以使用以下方式来保护和跟踪您对服务器的请求。

  1. 您可以通过以下方式强制移动或网络客户端在访问您的网络服务时向您发送Custom Headers设备类型REST methods

  2. 通过强制每个客户端拥有自己的用户名和密码来使用基本的 http 身份验证,这些用户名和密码由您作为授权的 Web 服务提供商提供。

  3. 如果您需要更高级的保护,您可以使用它OAuth 2.0来保护您的 Web 服务。

于 2013-01-02T18:00:39.963 回答
1

由于您的原始应用程序将是 Android 或 Windows Phone 应用程序,因此对于想要成为黑客的人来说,它们中的任何一个都相对容易调试。在任何情况下,您都将在您无法控制的机器上运行代码,因此没有 ssl 技巧或检查签名将解决您的基本问题。

对抗来自它的威胁的唯一方法是不信任客户。如果您正在制作游戏,请先验证来自客户端的输入是否有效,然后再对其进行操作 - 它是否附有有效的安全令牌等。

本质上构建您的服务,以便用户是否使用非官方客户端无关紧要。

于 2013-01-03T09:44:24.407 回答