一、隐私保护概述
随着移动终端及其相关业务(如移动支付、终端云等)的普及,用户隐私保护的重要性愈发突出。隐私保护是尊重个人权利、增加用户信任、确保个人信息安全的重要措施,也是法律法规的要求。个人信息的泄露和滥用可能导致不良后果,如个人诈骗、身份盗用、恶意广告等。
隐私是用户的基本权利,HarmonyOS非常重视用户的隐私。通过隐私保护措施,可以降低个人信息遭到滥用的风险,保护用户的财产和利益。实施良好的隐私保护措施不仅有助于建立良好的用户关系,还有助于保护用户和企业的利益。
二、隐私保护的原则
应用开发者在产品设计阶段就需要考虑用户隐私的保护,提高应用的安全性。HarmonyOS应用开发需要遵从隐私保护规则,在应用上架应用市场时,应用市场会根据规则进行校验,如不满足条件则无法上架。我们应遵循一套以控制力、透明度和数据最小化为核心的隐私保护的设计原则:
1、数据收集及使用公开透明
应用采集个人数据时,应清晰、明确地告知用户,并确保告知用户的个人信息将被如何使用
2、数据收集和使用最小化
应用个人数据收集应与数据处理目的相关,且是适当、必要的。开发者应尽可能对个人数据进行匿名或化名,降低对数据主体的风险。仅可收集和处理与特定目的相关且必需的个人数据,不能进行与特定目的不相关的进一步处理。
3、数据处理选择和控制
对个人数据处理必须要征得用户的同意,用户对其个人数据要有充分的控制权。
4、数据安全
从技术上保证数据处理活动的安全性,包括个人数据的加密存储、安全传输等安全机制,系统应默认开启或采取安全保护措施。
5、本地化处理
应用开发的数据优先在本地进行处理,对于本地无法处理的数据上传云服务时要满足最小化的原则,不能默认选择上传云服务。
6、未成年人数据保护要求
如果应用是针对未成年人设计的,或者应用通过收集的用户年龄数据识别出用户是未成年人,开发者应该结合目标市场国家的相关法律,专门分析未成年人个人数据保护的问题。收集未成年人数据前需要征得监护人的同意。
三、隐私保护常用方法
1、使用隐私声明获取用户同意
应用采集个人数据时,应清晰、明确地告知用户,并确保告知用户的个人信息将被如何使用。例如在应用启动的时候,可以使用隐私声明弹窗来说明敏感数据的使用和收集,获得用户同意后才能获取用户数据。
2、减少应用的位置信息访问权限
应用本身不是强位置关联应用(如导航、运动健康等),仅在"部分场景前台"需要使用位置信息(如:定位城市、打卡、分享位置等),推荐使用安全控件LocationButton来获取位置信息,其它情况优先推荐使用模糊定位。
3、减少使用存储权限
过多的存储访问权限可能会导致用户隐私数据的泄露,应该减少使用存储权限,仅请求访问应用程序所需的数据,可以用Picker来减少对用户存储数据的访问权限。
4、动态申请敏感权限
申请敏感权限的时候要满足权限最小化的要求,只申请获取必需的信息或资源所需要的权限,减少权限滥用和敏感数据泄露问题。
5、数据加密处理。
从技术上保证数据处理活动的安全性,包括个人数据的加密存储、安全传输等安全机制,应默认开启或采取安全保护措施。
四、隐私保护最佳实践
1、使用隐私声明获取用户同意
当用户安装或使用某个应用程序时,应用程序可能会请求访问用户的敏感权限,例如相机、麦克风、通讯录、位置等。通过弹出隐私声明弹窗,应用程序需要事先向用户说明授权的目的和使用方式,以便用户能够全面了解自己的个人数据将如何被应用程序使用。
隐私声明弹窗的作用有几个方面:
(1)增强用户控制权:隐私声明弹窗给予用户对于权限的授权选择,用户可以自主决定是否允许应用程序访问其敏感权限。这样可以使用户在安全和隐私方面更具主动性,增强对个人数据的控制;
(2)保护用户隐私:隐私声明弹窗确保用户在同意授权之前能够清楚地知道应用程序将如何使用其个人数据。这有助于防止应用程序滥用个人数据,保护用户的隐私权益;
(3)增强透明度:隐私声明弹窗可以为用户提供应用程序的数据使用透明度。通过在弹窗中提供详细的说明和解释,用户可以了解应用程序需要的权限及其使用目的,从而使用户更加放心地做出授权决策。
2、减少应用的位置信息访问权限
位置信息是用户的敏感信息之一,过多的位置信息暴露可能会导致用户被跟踪、盗窃、骚扰等问题。因此,限制应用的位置信息访问权限是保护个人隐私的一个重要方面。
只有当你的应用程序对位置信息的访问是至关重要的,才应该申请位置权限,否则应避免请求该权限,以保护用户的隐私和数据安全;当您需要申请位置权限时,应提供详细的说明和合理的解释,让用户清楚地了解为什么应用需要访问他们的位置信息。
您可以根据场景需要使用以下两种方式,来减少应用的位置信息访问权限:
(1)使用模糊定位获取位置信息。
target API level | 申请位置权限 | 申请结果 | 位置的精确度 |
---|---|---|---|
小于9 | ohos.permission.LOCATION | 成功 | 获取到精准位置,精准度在米级别。 |
大于等于9 | ohos.permission.LOCATION | 失败 | 无法获取位置。 |
大于等于9 | ohos.permission.APPROXIMATELY_LOCATION | 成功 | 获取到模糊位置,精确度为5公里。 |
大于等于9 | 同时申请ohos.permission.APPROXIMATELY_LOCATION和ohos.permission.LOCATION | 成功 | 获取到精准位置,精准度在米级别。 |
①实现模糊位置申请
a、首先需要在module.json5配置文件中声明ohos.permission.APPROXIMATELY_LOCATION权限
{
"module": {
// ...
"requestPermissions": [
{
"name": "ohos.permission.APPROXIMATELY_LOCATION",
"reason": "$string:location_reason",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
},
// ...
],
}
}
b、在需要使用位置信息的代 码块中,动态申请ohos.permission.APPROXIMATELY_LOCATION权限
let atManager = abilityAccessCtrl.createAtManager();
atManager.requestPermissionsFromUser(getContext(this), ['ohos.permission.APPROXIMATELY_LOCATION'])
.then((data) => {
console.info('request permissions result: ' + JSON.stringify(data));
})
c、获取位置信息,模糊定位和精确定位获取位置信息的接口一样,只是返回结果的精确度不一样
let requestInfo: geoLocationManager.LocationRequest = {
'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX,
'scenario': geoLocationManager.LocationRequestScenario.UNSET,
'timeInterval': 1,
'distanceInterval': 0,
'maxAccuracy': 0
};
geoLocationManager.getCurrentLocation(requestInfo).then((result) => {
this.message = JSON.stringify(result);
console.info('geoLocationManager current location: ' + JSON.stringify(result));
}).catch((error: BusinessError) => {
console.error('geoLocationManager promise, getCurrentLocation: error: ' + JSON.stringify(error));
});
(2)使用安全控件LocationButton获取位置信息。
用户通过点击安全控件的位置控件LocationButton,可以临时获取精准定位权限。敏感行为通过系统控件代理,识别用户主动行为,隐私行为可知可控。
②实现LocationButton
@State message: string = '';
requestInfo: geoLocationManager.LocationRequest = {
'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX,
'scenario': geoLocationManager.LocationRequestScenario.UNSET,
'timeInterval': 1,
'distanceInterval': 0,
'maxAccuracy': 0
};
locationChange = (err: BusinessError, location: geoLocationManager.Location) => {
if (err) {
console.info('locationChanger: err: ' + JSON.stringify(err));
return;
}
if (location) {
this.message = '打卡成功';
}
};
LocationButton({
icon: LocationIconStyle.LINES,
text: LocationDescription.PUNCH_IN,
buttonType: ButtonType.Circle
})
.onClick((event, result) => {
if (result == LocationButtonOnClickResult.SUCCESS) {
geoLocationManager.getCurrentLocation(this.requestInfo, this.locationChange);
}
})
3、减少使用存储权限
一般应用获取“存储”权限后,就能读取到手机内部存储上所有的文件,包含所有的照片,这就产生了隐私风险:它就可以在用户毫无感知的情况下,分析用户的文件和图片,将隐私“偷走“。
但是,用户通常不希望授予应用对其所有照片和视频的访问权限,因此,HarmonyOS在API9以后引入了Picker选择器,在保证用户正常的数据访问述求的同时,最小化减少应用的数据泄露。避免全量数据的授权,降低授权的颗粒度,例如用户在发送图片时,只想让应用访问到用户想要发送的。
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
photoSelectOptions.maxSelectNumber = 5;
const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
photoViewPicker.select(photoSelectOptions).then((photoSelectResult) => {
this.imageUri = photoSelectResult.photoUris[0];
console.info('PhotoViewPicker.select successfully, uris: ' + JSON.stringify(photoSelectResult));
}).catch((err: BusinessError) => {
console.error('PhotoViewPicker.select failed with err: ' + JSON.stringify(err));
});
4、动态申请敏感权限
敏感权限涉及访问个人数据(如:照片、通讯录、日历、本机号码、短信等)和操作敏感能力(如:相机、麦克风等)的权限,所以对于敏感权限的申请需要特别注意。
(1)合理的权限范围:应用程序应该仅请求其所需的敏感权限范围,并且把权限的范围限制在必要的最小范围内。这样做可以减少权限的滥用和数据泄露的风险
(2)最小化权限申请:应用程序只应该请求必要的敏感权限,而不是请求所有敏感权限。如果应用程序不需要某些敏感权限来执行其功能,则不应该请求这些权限
(3)明确解释权限用途:应用程序应该清楚、明确地解释它所请求的每个敏感权限的用途。应用程序也应该在隐私政策和应用程序的其他位置提供此信息
{
"module": {
// ...
"requestPermissions": [
{
"name": "ohos.permission.CAMERA",
"reason": "$string:camera_reason",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "inuse"
}
}
],
}
}
// string.json
{
"string": [
{
"name": "camera_reason",
"value": "扫描二维码功能需要使用相机权限来获图片"
}
]
}
let atManager = abilityAccessCtrl.createAtManager()
atManager.requestPermissionsFromUser(getContext(this), ['ohos.permission.CAMERA'])
.then((data) => {
// 权限申请成功后,执行扫码逻辑
});