AlarmManager和WakefullBroadcastReceiver传递的Extras是私有的?

时间:2017-01-27 18:31:26

标签: android alarmmanager android-alarms android-broadcastreceiver

我正在尝试使用AlarmManager实施一些警报计划。自从触发警报时,我想使用WakefulBroadcastReceiver启动IntentService来完成一些后台工作。

我有一些与警报意图传递参数的安全性/隐私性有关的问题。

  1. 为警报设置PendingIntent时,我会执行以下操作:

    Intent myIntent = new Intent(context, MyReceiver.class);        
    myIntent.putExtra("test", "testValue");
    Bundle bundle = new Bundle();
    bundle.putParcelable("bundleValue", bundleTestValue2);
    myIntent.putExtra("test3", bundle);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 323,
        myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
  2. 我的问题是:对于警报的pendingIntent,值设置为Extra的私有程度如何?是否有机会被其他应用程序读取,因为Android Alarm的管理员在安排后会使用它?

    1. 有一个像

      这样的接收器

      public class MyReceiver extends WakefulBroadcastReceiver {

      @Override
      public void onReceive(Context context, Intent intent) {
             startWakefulService(context, MyIntentService);
      }
      
    2. 在Android清单上

       <receiver
                  android:name=".receivers.MyReceiver"
                  android:exported="false"/>
      
       <service 
                android:name=".MyIntentService" 
                android:exported="false"/>
      

      服务

      public class MyIntentService extends IntentService {
      
        @Override
        protected void onHandleIntent(Intent intent) {
      
           try {
                //logic here
           } catch{
           } finaly{
                MyReceiver.completeWakefulIntent(intent);
           } 
      }
      

      从我的活动中调用

      sendBroadcast(new Intent(context, MyReceiver.class).putExtra(...);

      从闹钟安排待处理的意图

      Intent myIntent = new Intent(context, MyReceiver.class);        
      myIntent.putExtra("test", "testValue");
      
      PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 323,
          myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
      

      此接收器对其他应用程序有多暴露?它能对除我的以外的其他应用做出反应吗这是否会引发任何安全问题?

      谢谢。

      稍后编辑: 由于WakefullBroadcastReceiver似乎是确保我的服务获得部分唤醒锁的唯一方法,我如何确保100%其他应用程序不会知道我的接收器以及我的接收器不会接到任何其他电话除了根据我的活动或我的Alarm集制作的内容?

      WakefullBroadcastReceiver模式如何与CommonsWare的WakefulIntentService一起工作?

      稍后编辑: 我终于设法完成了我的实施。

      1. 如前所述,我的WakefulBroadcastReceiverIntentService都在我的Android Manifest中声明为exported="false",根据我的理解,这意味着只有我的应用才能访问它们。由于接收器未导出,它是否从应用程序外部接收广播?

      2. 设置闹钟时,请使用此PendingIntent

        Intent myIntent = new Intent(context, MyReceiver.class);
        myIntent.putExtra("databaseId", "1"); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 323, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);

      3. 从我的活动中调用时,我做了:

      4. sendBroadcast(new Intent(context, MyReceiver.class).putExtra("databaseId", "1"));

        这够了吗?

1 个答案:

答案 0 :(得分:2)

Intent其他内容相关的隐私权注意事项

总的来说,我会说将敏感数据放入Intent是不安全的做法。

理论上,如果Intent只能被特定应用程序使用(稍后讨论),那么只有该应用程序才能看到其内容。但是,鉴于大量的Android设备和操作系统版本(包括root设备和自定义ROM),我不会指望它。

您没有指定要在Intent个附加内容中传递的敏感数据类型,因此我只能提供以下一般建议:

  1. 确保您了解相关数据的“机密性级别”:它是秘密还是仅受限制?或者,它可能是公开的(在这种情况下不需要保护)?
  2. 尝试找到另一种不涉及在Intent中传递敏感数据的方法(我自己从未遇到过这样的需求)。
  3. 如果您绝对必须在Intent个附加内容中传递敏感数据,请考虑对其进行加密。加密模型应该足以达到数据的“机密性级别”,以及在数据被截获时可能造成的潜在危害(它可以一直到“服务器端”加密)。
  4. BroadcastReceiver

    相关的隐私/安全注意事项

    通常,BroadcastReceiver是接收“系统范围”广播的组件。广播是“系统范围的”这一事实应该说明与其相关的隐私程度。

    话虽如此,开发人员可以通过一种机制来限制广播的范围:自定义权限。使用自定义权限允许对广播进行两个“控制级别”:

    1. 如果广播需要特定权限,则只有BroadcastReceiver具有该权限才会接收广播。
    2. 如果BroadcastReceiver按特定权限过滤传入的广播,则只有携带该权限的广播才会传送给该接收者。
    3. 虽然上面的观点在第一眼看上去似乎相似,但这些是可以单独使用或组合使用的不同方案。第一种方案将广播与许可相关联(并且该广播的发送者不一定拥有该许可),而第二种方案通过特定许可过滤所有广播(并且接收者必须具有该许可)。

      您的案例中更好的方法

      编辑:如果“觉醒”不是要求的一部分,这可能是一个更好的方法。但它是。由于无法保证Service启动的AlarmManager将有机会获得唤醒锁定 - 这种方法不适合OP的情况。

      请注意,广播和自定义权限的设计是为了在应用程序级别引入“解耦” - 此方案允许发件人应用程序完全不知道接收应用程序,只要他们同意一个自定义权限(嗯,同样的方案也用于预先安装的公共权限,但您不希望使用公共权限保护您的敏感数据)。

      但是,在您的情况下,发件人和收件人是相同的应用程序。在这样的设置中,您并不需要与广播相关的所有麻烦 - 只需构建PendingIntent即可在您的应用内启动所需的Service,并且您可以立即获得所有内容:

      • PendingIntent以及关联的Intent在您的应用程序中启动特定的Service(按名称),因此没有其他应用程序可以拦截它(理论上,请记住上面的讨论)。
      • 目标Service可以不导出,因此其他应用程序无法以任何方式访问它。

      您欢迎:)