确定移动应用程序

时间:2013-02-17 14:52:03

标签: authentication mobile

是否可以识别(验证)移动应用程序HTTP请求? 例如,来自网络服务器的请求可以通过域或IP识别,假设我知道它应该从哪里来,我可以接受请求,或者如果它来自意外的来源则拒绝。

doe的移动应用程序有某种独特的ID(无法模仿)?

3 个答案:

答案 0 :(得分:3)

如果您需要从移动应用程序(本机编译的应用程序)进行安全HTTP调用(webservice API),您可以尝试以下方法:

编辑:此方法假设您不能依赖操作应用的用户进行身份验证(因为您可以简单地要求用户在应用中输入安全密码)。

  1. 假设您正在实施该应用,请在代码中保存某种秘密API密钥。

  2. 当应用程序通过HTTP进行API调用时,它将始终使用HTTPS完成(因此所有内容都已加密)。

  3. 该应用会将秘密API密钥作为网址参数发送。

  4. 服务器将通过检查密钥是否正确来进行身份验证。

  5. 嗅探应用流量不会泄露密钥(因为HTTPS)。

    您最容易受到反向设计应用程序以发现内部密钥的人的攻击。通过使用各种混淆和反调试技术可以使这变得困难,但不能使其真正变得不可能。只要您使用的是编译语言(如Objective-C,而不是用于网络应用程序的JS),如果没有任何特殊游戏,这已经很难了。如果您避免按原样放置API密钥字符串并使用应用程序中的一些简短代码进行计算,那么您发现它的难度要高出1000倍。

    在不了解您的具体问题的情况下,很难建议其他方法。如果您正在寻找不同的东西,请提供更多详细信息。

答案 1 :(得分:3)

实践中使用了两种方法。 HTTP基本身份验证(移动应用程序不太安全)和OAuth2(与HTTP基本身份验证相比是安全的)。

  • HTTP基本身份验证:对于API服务的技术编写者以及使用它们的开发人员来说,此过程很简单:

为开发人员提供API密钥(通常是ID和密钥)。此API密钥通常如下所示:3bb743bbd45d4eb8ae31e16b9f83c9ba:ffb7d6369eb84580ad2e52ca3fc06c9d。

他负责将API密钥存储在其服务器上的安全位置,以便任何人都无法访问它。他通过在HTTP Authorization标头中提供API密钥以及单词“Basic”(API服务器用来正确解码授权凭证)来向API服务发出API请求。密钥也是Base64编码。

例如密钥可以是:3bb743bbd45d4eb8ae31e16b9f83c9ba:ffb7d6369eb84580ad2e52ca3fc06c9d

以base64编码:M2JiNzQzYmJkNDVkNGViOGFlMzFlMTZiOWY4M2M5YmE6ZmZiN2Q2MzY5ZWI4NDU4MGFkMmU1MmNhM2ZjMDZjOWQ =。

API服务器会反转此过程。当它找到HTTP Authorization标头时,它将解码base64结果,读取API密钥ID和Secret并在允许处理请求之前验证这些令牌。

HTTP基本身份验证很简单,但对于保护API密钥的移动应用程序来说是一个主要问题。 HTTP基本身份验证要求通过线路为每个请求发送原始API密钥,从而增加长期滥用的可能性。 此外,由于您无法将API密钥安全地嵌入分发给许多用户的移动应用程序中,因此这是不切实际的。

例如,如果您构建一个嵌入了API密钥的移动应用程序,用户可以对您的应用进行逆向工程,公开此API密钥并滥用您的服务。

因此,在开放环境(如Web浏览器和移动应用程序)中,HTTP基本身份验证存在风险。

注意:与所有身份验证协议一样,HTTP基本身份验证必须始终通过SSL使用。

  • 适用于移动API安全的OAuth2:

    OAuth2是一种出色的协议,用于保护开放设备的API服务,并提供了一种通过令牌身份验证对移动用户进行身份验证的更好方法。

OAuth2令牌身份验证从用户角度运行(OAuth2将其命名为密码授予流程):

当用户启动移动应用程序时,系统会提示他输入用户名或电子邮件和密码。 开发人员从app向API服务发送POST请求,其中包含登录数据(通过SSL)。然后验证用户凭据,并为用户创建在一定时间后过期的访问令牌。此访问令牌可以存储在移动设备上,将其视为允许访问API服务的API密钥。当访问令牌过期时,系统会再次提示用户输入登录详细信息。

OAuth2生成访问令牌,这些令牌可以临时存储在开放环境中并且是安全的。它是安全的,因为访问令牌是为临时目的而生成的,它可以降低潜在的伤害。

根据使用的移动平台存储令牌。对于Android应用,访问令牌可以存储在共享首选项中,也可以存储在iOS应用中的Keychain中。

答案 2 :(得分:2)

这取决于您如何定义“移动应用程序”。在移动设备上运行的任何应用程序?在移动设备上运行的网页浏览?什么是移动设备?

无论如何,一般简短的回答是,您可以使用HTTP标头中发送的User-Agent检测设备类型。所有流行的移动浏览器发送此。但请注意:

  • 可以欺骗(轻松)
  • 某些应用程序(即iPhone或Android应用程序及类似应用程序)可以通过这种方式编写,即不会向用户代理发送HTTP请求。最佳实践要求发送用户代理。

我不知道有更可靠的方法来做到这一点;只要通过HTTP发生的事情,通常就无法确定任何有关客户端的信息。对于大多数用例,您可以查看User-Agent。

您可以购买包含各种设备数据的用户代理数据库的访问权限(如果适用),其中两种是WURFLDeviceAtlas