我正在尝试使用AlarmManager
实施一些警报计划。自从触发警报时,我想使用WakefulBroadcastReceiver
启动IntentService
来完成一些后台工作。
我有一些与警报意图传递参数的安全性/隐私性有关的问题。
为警报设置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);
我的问题是:对于警报的pendingIntent,值设置为Extra
的私有程度如何?是否有机会被其他应用程序读取,因为Android Alarm的管理员在安排后会使用它?
有一个像
这样的接收器 public class MyReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
startWakefulService(context, MyIntentService);
}
在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一起工作?
稍后编辑: 我终于设法完成了我的实施。
如前所述,我的WakefulBroadcastReceiver
和IntentService
都在我的Android Manifest中声明为exported="false"
,根据我的理解,这意味着只有我的应用才能访问它们。由于接收器未导出,它是否从应用程序外部接收广播?
设置闹钟时,请使用此PendingIntent
:
Intent myIntent = new Intent(context, MyReceiver.class);
myIntent.putExtra("databaseId", "1");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 323,
myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
从我的活动中调用时,我做了:
sendBroadcast(new Intent(context, MyReceiver.class).putExtra("databaseId", "1"));
这够了吗?
答案 0 :(得分:2)
与Intent
其他内容相关的隐私权注意事项
总的来说,我会说将敏感数据放入Intent
是不安全的做法。
理论上,如果Intent
只能被特定应用程序使用(稍后讨论),那么只有该应用程序才能看到其内容。但是,鉴于大量的Android设备和操作系统版本(包括root设备和自定义ROM),我不会指望它。
您没有指定要在Intent
个附加内容中传递的敏感数据类型,因此我只能提供以下一般建议:
Intent
中传递敏感数据的方法(我自己从未遇到过这样的需求)。Intent
个附加内容中传递敏感数据,请考虑对其进行加密。加密模型应该足以达到数据的“机密性级别”,以及在数据被截获时可能造成的潜在危害(它可以一直到“服务器端”加密)。 与BroadcastReceiver
通常,BroadcastReceiver
是接收“系统范围”广播的组件。广播是“系统范围的”这一事实应该说明与其相关的隐私程度。
话虽如此,开发人员可以通过一种机制来限制广播的范围:自定义权限。使用自定义权限允许对广播进行两个“控制级别”:
BroadcastReceiver
具有该权限才会接收广播。BroadcastReceiver
按特定权限过滤传入的广播,则只有携带该权限的广播才会传送给该接收者。虽然上面的观点在第一眼看上去似乎相似,但这些是可以单独使用或组合使用的不同方案。第一种方案将广播与许可相关联(并且该广播的发送者不一定拥有该许可),而第二种方案通过特定许可过滤所有广播(并且接收者必须具有该许可)。
您的案例中更好的方法
编辑:如果“觉醒”不是要求的一部分,这可能是一个更好的方法。但它是。由于无法保证Service
启动的AlarmManager
将有机会获得唤醒锁定 - 这种方法不适合OP的情况。
请注意,广播和自定义权限的设计是为了在应用程序级别引入“解耦” - 此方案允许发件人应用程序完全不知道接收应用程序,只要他们同意一个自定义权限(嗯,同样的方案也用于预先安装的公共权限,但您不希望使用公共权限保护您的敏感数据)。
但是,在您的情况下,发件人和收件人是相同的应用程序。在这样的设置中,您并不需要与广播相关的所有麻烦 - 只需构建PendingIntent
即可在您的应用内启动所需的Service
,并且您可以立即获得所有内容:
PendingIntent
以及关联的Intent
在您的应用程序中启动特定的Service
(按名称),因此没有其他应用程序可以拦截它(理论上,请记住上面的讨论)。Service
可以不导出,因此其他应用程序无法以任何方式访问它。您欢迎:)