为有牺牲多壮志,敢教日月换新天。

HarmonyOS:应用隐私保护

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ 
➤GitHub地址:https://github.com/strengthen
➤原文地址:https://www.cnblogs.com/strengthen/p/18519104
➤如果链接不是为敢技术的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

  

隐私保护概述

随着移动终端及其相关业务(如移动支付、终端云等)的普及,用户隐私保护的重要性愈发突出。隐私保护是尊重个人权利、增加用户信任、确保个人信息安全的重要措施,也是法律法规的要求。个人信息的泄露和滥用可能导致不良后果,如个人诈骗、身份盗用、恶意广告等。

隐私是用户的基本权利,HarmonyOS非常重视用户的隐私。通过隐私保护措施,可以降低个人信息遭到滥用的风险,保护用户的财产和利益。实施良好的隐私保护措施不仅有助于建立良好的用户关系,还有助于保护用户和企业的利益。

为了更好的进行应用隐私保护,开发者首先需要了解以下基本信息:

  1. 什么是隐私数据:根据个人数据的定义,数据分为个人数据、非个人数据两类;根据个人数据的敏感程度,个人数据细分为敏感个人数据、一般个人数据,健康、性生活、个人基因、宗教信仰、生物体征等属于敏感数据。
  2. 隐私保护的原则
  3. 隐私保护的措施:隐私保护的一些建议和方法,以及隐私保护的一些最佳实践

隐私保护的原则

应用开发者在产品设计阶段就需要考虑用户隐私的保护,提高应用的安全性。HarmonyOS应用开发需要遵从隐私保护规则,在应用上架应用市场时,应用市场会根据规则进行校验,如不满足条件则无法上架。我们应遵循一套以控制力、透明度和数据最小化为核心的隐私保护的设计原则:

  1. 数据收集及使用公开透明。

    应用采集个人数据时,应清晰、明确地告知用户,并确保告知用户的个人信息将被如何使用。

  2. 数据收集和使用最小化。

    应用个人数据收集应与数据处理目的相关,且是适当、必要的。开发者应尽可能对个人数据进行匿名或化名,降低对数据主体的风险。仅可收集和处理与特定目的相关且必需的个人数据,不能进行与特定目的不相关的进一步处理。

  3. 数据处理选择和控制。

    对个人数据处理必须要征得用户的同意,用户对其个人数据要有充分的控制权。

  4. 数据安全。

    从技术上保证数据处理活动的安全性,包括个人数据的加密存储、安全传输等安全机制,系统应默认开启或采取安全保护措施。

  5. 本地化处理。

    应用开发的数据优先在本地进行处理,对于本地无法处理的数据上传云服务时要满足最小化的原则,不能默认选择上传云服务。

  6. 未成年人数据保护要求。

    如果应用是针对未成年人设计的,或者应用通过收集的用户年龄数据识别出用户是未成年人,开发者应该结合目标市场国家的相关法律,专门分析未成年人个人数据保护的问题。收集未成年人数据前需要征得监护人的同意。

隐私保护常用方法

下面我们列举了应用隐私保护的一些常用方法。

  1. 使用隐私声明获取用户同意。

    应用采集个人数据时,应清晰、明确地告知用户,并确保告知用户的个人信息将被如何使用。例如在应用启动的时候,可以使用隐私声明弹窗来说明敏感数据的使用和收集,获得用户同意后才能获取用户数据。

  2. 减少应用的位置信息访问权限。

    应用本身不是强位置关联应用(如导航、运动健康等),仅在"部分场景前台"需要使用位置信息(如:定位城市、打卡、分享位置等),推荐使用安全控件LocationButton来获取位置信息,其它情况优先推荐使用模糊定位。

  3. 减少使用存储权限。

    过多的存储访问权限可能会导致用户隐私数据的泄露,应该减少使用存储权限,仅请求访问应用程序所需的数据,可以用Picker来减少对用户存储数据的访问权限。

  4. 动态申请敏感权限。

    申请敏感权限的时候要满足权限最小化的要求,只申请获取必需的信息或资源所需要的权限,减少权限滥用和敏感数据泄露问题。

  5. 数据加密处理。

    从技术上保证数据处理活动的安全性,包括个人数据的加密存储、安全传输等安全机制,应默认开启或采取安全保护措施。

    存储敏感数据应该进行加密处理,具体可以参考《应用数据安全》。

隐私保护最佳实践

下面我们再来介绍一些隐私保护的最佳实践,开发者可以参考这些实践来解决应用的隐私保护问题。

使用隐私声明获取用户同意

当用户安装或使用某个应用程序时,应用程序可能会请求访问用户的敏感权限,例如相机、麦克风、通讯录、位置等。通过弹出隐私声明弹窗,应用程序需要事先向用户说明授权的目的和使用方式,以便用户能够全面了解自己的个人数据将如何被应用程序使用。

隐私声明弹窗的作用有几个方面:

  1. 增强用户控制权:隐私声明弹窗给予用户对于权限的授权选择,用户可以自主决定是否允许应用程序访问其敏感权限。这样可以使用户在安全和隐私方面更具主动性,增强对个人数据的控制。
  2. 保护用户隐私:隐私声明弹窗确保用户在同意授权之前能够清楚地知道应用程序将如何使用其个人数据。这有助于防止应用程序滥用个人数据,保护用户的隐私权益。
  3. 增强透明度:隐私声明弹窗可以为用户提供应用程序的数据使用透明度。通过在弹窗中提供详细的说明和解释,用户可以了解应用程序需要的权限及其使用目的,从而使用户更加放心地做出授权决策。

总而言之,隐私声明弹窗在HarmonyOS中的目的是保护用户隐私权益并增强用户对个人数据的控制。它提供了透明度和选择权,使用户能够全面了解应用程序的权限要求,并自主决定是否授权。

例如在“HMOS世界”中使用了隐私声明的弹窗,具体实现可以参考代码SafePage.ets。应用首次启动后,会弹出该弹窗,当应用获得用户授权同意后,应用才能开始正常使用。

减少应用的位置信息访问权限

位置信息是用户的敏感信息之一,过多的位置信息暴露可能会导致用户被跟踪、盗窃、骚扰等问题。因此,限制应用的位置信息访问权限是保护个人隐私的一个重要方面。

只有当你的应用程序对位置信息的访问是至关重要的,才应该申请位置权限,否则应避免请求该权限,以保护用户的隐私和数据安全;当您需要申请位置权限时,应提供详细的说明和合理的解释,让用户清楚地了解为什么应用需要访问他们的位置信息。

您可以根据场景需要使用以下两种方式,来减少应用的位置信息访问权限:

  • 使用模糊定位获取位置信息。
  • 使用安全控件LocationButton获取位置信息。

使用模糊定位获取位置信息

对于大多数与位置相关的场景,仅请求粗略位置信息的访问权限即可满足要求。例如,天气应用可以基于用户所处的城市或地区提供准确的天气预报,而无需知道用户的具体经纬度,这里我们可以使用模糊位置。HarmonyOS在API9以后,提供模糊位置信息的能力,会为应用提供精确到5公里内的用户位置估算值,这种精度对应用的许多功能而言应已足够。

表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

成功

获取到精准位置,精准度在米级别。

在API9以后,当应用同时申请ohos.permission.APPROXIMATELY_LOCATION和ohos.permission.LOCATION权限时,可以获取到用户精准位置,精准度在米级别;应用仅申请 ohos.permission.APPROXIMATELY_LOCATION:权限弹框仅显示模糊位置权限,用户如授权,则授权APPROXIMATELY_LOCATION模糊权限,应用获取模糊位置。这两种情况下的权限申请弹框如下:

图1 权限申请弹窗

接下来介绍如何实现模糊位置申请:

  1. 首先需要在module.json5配置文件中声明ohos.permission.APPROXIMATELY_LOCATION权限。
    {
      "module": {
        // ...
        "requestPermissions": [
          {
            "name": "ohos.permission.APPROXIMATELY_LOCATION",
            "reason": "$string:location_reason",
            "usedScene": {
              "abilities": [
                "EntryAbility"
              ],
              "when": "inuse"
            }
          },
          // ...
        ],
      }
    }
  2. 在需要使用位置信息的代码块中,动态申请ohos.permission.APPROXIMATELY_LOCATION权限。
    let atManager = abilityAccessCtrl.createAtManager();
    atManager.requestPermissionsFromUser(getContext(this), ['ohos.permission.APPROXIMATELY_LOCATION'])
      .then((data) => {
        Logger.info(`request permissions result: ${JSON.stringify(data)}`);
      })
  3. 获取位置信息,模糊定位和精确定位获取位置信息的接口一样,只是返回结果的精确度不一样。
    let requestInfo: geoLocationManager.LocationRequest = {
      'priority': geoLocationManager.LocationRequestPriority.FIRST_FIX,
      'scenario': geoLocationManager.LocationRequestScenario.UNSET,
      'timeInterval': 1,
      'distanceInterval': 0,
      'maxAccuracy': 0
    };
    
    geoLocationManager.getCurrentLocation(requestInfo).then((result) => {
      Logger.info(`geoLocationManager current location: ${JSON.stringify(result)}`);
      // ...
    }).catch((error: BusinessError) => {
      Logger.error(`geoLocationManager promise, getCurrentLocation: error: ${JSON.stringify(error)}`);
    });
说明

权限的申请具体可以参考:向用户申请授权

使用LocationButton获取位置信息

用户通过点击安全控件的位置控件LocationButton,可以临时获取精准定位权限。敏感行为通过系统控件代理,识别用户主动行为,隐私行为可知可控。比如打卡、发送实时位置等用户主动行为的场景,可以使用LocationButton。例如实现考勤打卡功能,获取位置使用LocationButton获取位置信息的主要代码如下:

@State message: ResourceStr = '';
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) {
    Logger.error(`locationChanger: err: ${JSON.stringify(err)}`);
    return;
  }
  if (location) {
    this.message = $r('app.string.punch_successfully');
  }
};
LocationButton({
  icon: LocationIconStyle.LINES,
  text: LocationDescription.PUNCH_IN,
  buttonType: ButtonType.Circle
})
  .onClick((event, result) => {
    if (result === LocationButtonOnClickResult.SUCCESS) {
      geoLocationManager.getCurrentLocation(this.requestInfo, this.locationChange);
    }
  })

示例图如下:

减少使用存储权限

一般应用获取“存储”权限后,就能读取到手机内部存储上所有的文件,包含所有的照片,这就产生了隐私风险:它就可以在用户毫无感知的情况下,分析用户的文件和图片,将隐私“偷走“。

但是,用户通常不希望授予应用对其所有照片和视频的访问权限,因此,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];
  Logger.info(`PhotoViewPicker.select successfully, uris: ${JSON.stringify(photoSelectResult)}`);
}).catch((err: BusinessError) => {
  Logger.error(`PhotoViewPicker.select failed with err: ${JSON.stringify(err)}`);
});

动态申请敏感权限

敏感权限涉及访问个人数据(如:照片、通讯录、日历、本机号码、短信等)和操作敏感能力(如:相机、麦克风等)的权限,所以对于敏感权限的申请需要特别注意。

  1. 合理的权限范围:应用程序应该仅请求其所需的敏感权限范围,并且把权限的范围限制在必要的最小范围内。这样做可以减少权限的滥用和数据泄露的风险。
  2. 最小化权限申请:应用程序只应该请求必要的敏感权限,而不是请求所有敏感权限。如果应用程序不需要某些敏感权限来执行其功能,则不应该请求这些权限。
  3. 明确解释权限用途:应用程序应该清楚、明确地解释它所请求的每个敏感权限的用途。应用程序也应该在隐私政策和应用程序的其他位置提供此信息。

例如商品扫码的功能,我们需要首先在module.json5配置文件中声明相机权限,在reason字段中说明相机权限的使用用途。

{
  "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) => {
    let grantStatus: Array<number> = data.authResults;
    if (grantStatus.length > 0 && grantStatus[0] === 0) {
      // The user is authorized to continue to access the target operation
      Logger.info('request permissions granted');
      // ...
    } else {
      // The user rejects the authorization
      Logger.info('request permissions denied');
      // ...
    }
  })

总结与回顾

本文主要介绍了隐私保护的重要性、列举了隐私保护的一些常见做法,并详细介绍了隐私保护的几个最佳实践:

  • 使用隐私声明获取用户同意
  • 减少应用的位置信息访问权限
  • 减少使用存储权限
  • 动态申请敏感权限

请注意,这些只是一些常见的HarmonyOS隐私最佳实践,具体实施策略可能因应用的特定需求和法律法规要求而有所变化。你应该根据你的应用类型和用户定位,结合适用的隐私法规进行更全面和具体的隐私保护措施。

示例代码:应用隐私保护

  

posted @ 2024-10-31 23:03  为敢技术  阅读(2)  评论(0编辑  收藏  举报