Android 在我自己的应用程序中发送敏感意图附加信息的安全性?

Android 在我自己的应用程序中发送敏感意图附加信息的安全性?,android,security,application-security,Android,Security,Application Security,我有一个活动要求输入用户名和密码,然后在我的应用程序中启动另一个活动以完成用户注册。我想将用户名+密码作为额外目的发送到第二个活动。比如: Intent intent = new Intent(activity, SecondActivity.class); intent.putExtra("u", username); intent.putExtra("p", password); startActivity(intent); 我的清单定义了第二个活动,如: <activity

我有一个活动要求输入用户名和密码,然后在我的应用程序中启动另一个活动以完成用户注册。我想将用户名+密码作为额外目的发送到第二个活动。比如:

Intent intent = new Intent(activity, SecondActivity.class);
intent.putExtra("u", username);
intent.putExtra("p", password);
startActivity(intent);
我的清单定义了第二个活动,如:

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

现在,我对像这样将用户名+密码作为意图附加程序发送的安全性产生了怀疑——是否有可能让另一个应用程序使用伪造的意图过滤器拦截SecondActivity的调用?除此之外,我想知道intent extras会发生什么,它们是否被操作系统持久化到磁盘?如果有的话,也许有人能在那里看到它们


感谢

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

这里的关键在于隐式意图和显式意图之间的区别。您的示例使用显式意图,因为您正在指定要运行的确切类。这很好,因为显式意图无法被截获,并且将保留在应用程序中

然而,隐式意图打开了几个可能的攻击向量。更详细地谈论它。我强烈建议不要使用含蓄的意图来传递任何类型的敏感信息

从:

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

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

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

编辑

至于将额外的意图持久化到磁盘,是的,这是一个风险。但是,请记住,如果有人在设备上具有root访问权限,并且正在使用它尝试在磁盘上搜索此持久化的意图信息,则可能有更简单的方法让他们获得相同的信息。不管你做什么,除非你做了一些非常出色的加密,否则拥有物理设备root访问权限的人很可能能够获得该密码


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

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

当您指定要直接启动的活动时,我非常确定您通过传递任何形式的IntentFilter。请您指出拦截显式意图的工作原理。马克·墨菲(Mark Murphy)写了一篇优秀的简短总结:还有,意图“额外”可以通过访问RecentTaskInfo的baseIntent对象来读取(任何具有GET_TASKS权限的应用程序都可以读取)。虽然现在不推荐使用,但它适用于较旧的版本。