我有一项要求输入用户名和密码的活动,然后在我的应用中启动另一项活动以完成用户注册。我想将用户名+密码作为意图附加内容发送到第二个活动。类似的东西:
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?除此之外,我想知道附加意图会发生什么,它们是否曾被操作系统持久存储到磁盘上?如果有的话,有人可能会在那里看一下。
由于
答案 0 :(得分:10)
这里的关键是隐含意图和显式意图之间的区别。您的示例使用Explicit Intent,因为您指定了要运行的确切类。这很好,因为Explicit Intents不能被拦截并且将保留在你的应用程序中。
隐式意图然而,打开几个可能的攻击向量。 This article更详细地讨论了它。我非常建议不要使用Implicit Intents传递任何类型的敏感信息。
来自Android Docs:
Explicit Intents指定了一个组件(通过setComponent(ComponentName)或setClass(Context,Class)),它提供了要运行的确切类。
隐含意图未指定组件;相反,他们必须为系统包含足够的信息,以确定哪个可用组件最适合该意图运行。
正如我所说,对于你在问题中的例子,通过Intent传递密码是相对安全的,因为没有其他应用程序可以在运行时拦截它。但重要的是要注意,并非总是如此,并且使用隐式Intent理论上可以允许Intent Interception并暴露敏感信息。
修改:
至于将Intent Extras持久保存到磁盘,是的,这是一个风险。但请记住,如果有人在设备上具有root访问权限并且正在使用它来尝试在磁盘中搜索此持久意图信息,则可能有更简单的方法来获取相同的信息。无论你做什么,有权访问物理设备的人都可以关闭密码,除非你做了一些非常优秀的加密。
我对整体安全性观点的建议是尽量不要在任何长期或持久的环境中直接处理密码。密码只应在登录过程中使用,并在之后立即丢弃(假设您正在使用服务器进行身份验证)。因此,在正常使用应用程序(具有真实密码的合法用户)的情况下,您不必担心恶意行为者检查设备内存,因为当恶意行为者获取设备时,密码长期以来一直被从内存中移除。
答案 1 :(得分:1)
第三方应用可能会拦截系统范围的意图。我建议在将数据发送到下一个意图之前对其进行加密,然后在收到数据后对其进行解密。
答案 2 :(得分:0)
处理密码应始终是一个非常短期的事情。建议仅将它们用于身份验证请求,然后将其丢弃。根据您的问题的具体细节,即通过明确的意图在活动之间发送密码,这是安全的,以至于没有其他应用程序能够拦截它并查看值。但是,密码值需要在某处(内存或磁盘)维护,以便将其传递给您的辅助活动。如果它保存在磁盘上,则很容易检索。如果将其保留在内存中,则访问您设备的攻击者可以将其设置为root,然后执行内存转储以查看内存中的值。因此,不建议以这种方式处理密码。