21

我有一个活动要求输入用户名和密码,然后在我的应用程序中启动另一个活动以完成用户注册。我想将用户名+密码作为意图附加信息发送到第二个活动。就像是:

Intent intent = new Intent(activity, SecondActivity.class);
intent.putExtra("u", username);
intent.putExtra("p", password);
startActivity(intent);

我的清单定义了 SecondActivity,例如:

<activity
   android:name="com.me.SecondActivity"
   android:label="">
   <meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value="com.me.FirstActivity" />
</activity>

现在我对发送用户名+密码作为这样的意图附加信息的安全性表示怀疑 - 另一个应用程序是否有可能使用欺骗性意图过滤器拦截 SecondActivity 的调用?除此之外,我想知道额外的意图会发生什么,它们是否曾经被操作系统持久化到磁盘上?如果是这样的话,有人可能会在那里看到它们。

谢谢

4

3 回答 3

16

这里的关键是隐式意图显式意图之间的区别。您的示例使用显式意图,因为您正在指定要运行的确切类。这很好,因为 Explicit Intents 不能被拦截并且会留在你的应用程序中。

然而,隐式意图开辟了几种可能的攻击媒介。这篇文章更详细地讨论了它。我强烈建议不要使用隐式意图来传递任何类型的敏感信息。

来自Android 文档

显式意图指定了一个组件(通过 setComponent(ComponentName) 或 setClass(Context, Class)),它提供了要运行的确切类。

隐式意图没有指定组件;相反,它们必须包含足够的信息,以便系统确定哪些可用组件最适合为该意图运行。

正如我所说,对于您在问题中的示例,通过 Intent 传递密码是相对安全的,因为没有其他应用程序可以在运行时拦截它。但需要注意的是,情况并非总是如此,使用隐式 Intent 理论上可以允许 Intent 拦截并暴露敏感信息。

编辑

至于将 Intent Extras 持久化到磁盘,是的,这是一个风险。但是请记住,如果有人在设备上具有 root 访问权限,并且正在使用它来尝试在磁盘中搜索此持久的意图信息,那么他们可能有更简单的方法来获取相同的信息。无论您做什么,除非您进行了一些非常出色的加密,否则对物理设备具有 root 访问权限的人可能能够获取该密码。

从整体安全角度来看,我的建议是尽量不要在任何类型的长期或持久性环境中直接处理密码。密码只能在登录过程中使用,并在之后立即丢弃(假设您正在使用服务器进行身份验证)。因此,在正常使用应用程序(具有真实密码的合法用户)的情况下,您不必担心恶意行为者会检查设备内存,因为当恶意行为者获得设备时,密码早已从记忆中删除。

于 2014-06-10T14:19:14.770 回答
1

第三方应用程序可以拦截系统范围的意图。我建议在将数据发送到下一个意图之前对其进行加密,然后在收到数据后对其进行解密。

于 2014-06-10T13:01:56.243 回答
0

处理密码应该永远是一个非常短期的事情。建议仅将它们用于身份验证请求,然后丢弃它们。谈到您的问题的细节,即通过明确的意图在活动之间发送密码,这是安全的,因为没有其他应用程序能够拦截它并查看该值。但是,密码值需要保存在某个地方(内存或磁盘),以便将其传递给您的辅助活动。如果它保存在磁盘上,则很容易检索。如果它保存在内存中,则可以访问您的设备的攻击者可以根它,然后执行内存转储以查看内存中的值。因此,不建议以这种方式处理密码。

于 2016-06-10T08:22:48.703 回答