android - 在不对每个 Web 服务调用使用 SSL 加密的情况下保持持久登录

标签 android security authentication ssl cookies

首先,对于提出一个新手安全问题,我深表歉意。这是我第一次真正涉足在线安全领域,我有点迷茫。

我正在开发一个 Android 应用程序和一个随附的网站,这两个应用程序都需要用户登录才能使用我的网络服务器提供的服务。这些服务都是以无 session 方式编写的,这意味着经过身份验证的请求(需要用户凭据的请求)都需要提供其随附的安全 token 才能运行,并且每个经过身份验证的请求首先必须验证用户的凭据。

我开发这种架构的方法是让用户使用电子邮件和密码登录。此信息通过 SSL 发送到身份验证服务器,并提供身份验证 token (密码哈希的独立哈希)。然后将此 token 存储在客户端上(用于网站的 cookie 和 android 中的私有(private)共享首选项)。对于以后的所有调用,除非用户注销,否则此 token 有效并可用于对用户进行身份验证。每个设备(不同的 Android 设备或 Web 客户端)也有自己独立的 token ,因此身份验证 token 是一对哈希 token + 设备 ID。

此外,我想避免对每个经过身份验证的调用都使用 SSL。理想情况下,我只希望对初始身份验证(使用电子邮件/密码)进行加密,其余调用使用用户登录时获得的身份验证 token 通过 HTTP 进行。我避免这种情况的原因是三次握手成本和保持持久或长期连接不是首选。

但是,不使用 SSL 会让我容易受到中间人攻击 (MIM)。如果任何人拦截调用并获得 [设备 ID + 身份验证 token ],出于所有 Intent 和目的,他们将能够冒充用户并访问用户可以访问的所有内容,直到用户注销,此时点 token 将失效。

我知道我的实现无法处理 MIM 攻击,所以我想知道您是否可以建议另一种实现方法,即不为每次调用都包含 SSL,但又能避免 MIM 攻击。

简而言之,我的要求是:

  • 不要在服务器上维护 session
  • 仅将 SSL 用于初始登录(电子邮件/密码对)
  • 不要对提供身份验证 token 和设备 ID 的后续调用使用 SSL
  • 尽可能避免 MIM 攻击(这是真正的要求)

是否可以同时满足所有 4 个要求?我能否避免使用 SSL 连接并仍然保持安全、无 session 的服务器?我的实现哪里出了问题,如何避免 MIM 攻击问题?

非常感谢,如果这是重复的,我们深表歉意。我无法在任何地方找到答案。也许我在寻找错误的东西。如果是这样,请告诉我,我将关闭/删除问题。

最佳答案

SSL 在 OSI session 层保持状态,并使用共享 key 加密整个消息。如果您想要一个廉价的解决方案来防止 MIM 并且没有服务器状态,我能想到的唯一(低安全性)解决方案是使用服务器范围的全局 secret 并在初始 SSL 过程中将其发送到客户端。以下 HTTP 往返将使用此共享 key 加密请求/响应。
但它只是一个实现不当的 SSL,应用程序级别的加密/解密过程可能比内置 SSL 的成本更高。而且您无法加密 header !

关于android - 在不对每个 Web 服务调用使用 SSL 加密的情况下保持持久登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26634779/

相关文章:

android - 如何制作自定义 map 演示

android - 如何在不改变位置的情况下旋转位图

ruby-on-rails - 目录 : Securing a Closed API

mysql - 限制对 MySQL 中行子集的访问

.net - C# 线程和 SQL 连接

ios - 如何在 iOS 共享扩展中正式处理未经身份验证的用户?

android - 如何将多个项目放在 ListView 的同一行?

android - 第二次单击标记时隐藏 infoWindow(Google Map Android API V2)

email - 验证 "Email Submission"用例中的用户

authentication - 缺少其余请求的身份验证elasticsearch