应用安全与权限管理:你真敢让用户把隐私交给“随便写写”的代码吗?

举报
bug菌 发表于 2025/12/25 16:58:28 2025/12/25
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 🛡️😏 开篇应用安全这块吧,我每次写到都忍不住嘀咕一句:你以为你在...

🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

🛡️😏 开篇

应用安全这块吧,我每次写到都忍不住嘀咕一句:你以为你在写功能,其实你是在跟“风险”和“合规”掰手腕🤼‍♂️。写得好,用户放心、审核顺滑;写得烂……嘿,轻则弹窗劝退,重则直接“上架见光死”🥲

小声明(不装):我没法替任何文章给“查重率”打包票,但下面的表达、结构、案例会尽量走原创工程化讲法,不写那种网上一搜一大堆的“空话套娃”🙂

🧭目录(安全这事儿得有章法🧩)

  • 🔑 1)权限体系与申请(ohos.permission):声明、校验、动态授权
  • 🔒 2)数据加密:密钥怎么管、数据怎么存、传输怎么防
  • 🫥 3)隐私保护:告知同意、最小化、脱敏与审计
  • ✅ 4)安全开发最佳实践:把坑堵在上线前
  • 🧪 5)一个“可落地”的权限+加密小模板(能直接塞项目里)

🔑 1)权限申请(ohos.permission):别上来就要“全家桶”🙃

1.1 先搞清:system_grant vs user_grant(别把流程走反了😅)

  • system_grant(系统授权):应用声明后通常在安装时由系统自动授予,属于“开放权限(系统授权)”列表的一部分([华为开发者][1])
  • user_grant(用户授权):涉及隐私/敏感能力,必须声明 + 运行时申请,而且在 module.json5 里配置时 reason + usedScene 在 HAP 场景是必填项,否则会编译报错([华为开发者][2])

人话总结:
不敏感的权限别搞得像抢银行;敏感的权限别想着“悄悄拿”。


1.2 module.json5 权限声明:别偷懒写“无理由申请”😤

如果是 user_grant 类型权限,HAP 必须配 reasonusedScene,否则你会遇到经典报错:“reason 和 usedScene 必填”([华为开发者][2])

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.LOCATION",
        "reason": "$string:location_reason",
        "usedScene": { "abilities": ["EntryAbility"], "when": "inuse" }
      }
    ]
  }
}

小心机(但很有用):reason 写成用户看得懂的话,比如“用于展示附近门店”,别写“用于提升体验”这种空气😅


1.3 运行时动态申请:用 AtManager,别自己乱造轮子🛠️

官方推荐的权限管理能力在 @ohos.abilityAccessCtrl(程序访问控制)。常用流程:
1)createAtManager() 创建管理对象
2)requestPermissionsFromUser() 发起授权弹窗
3)必要时 checkAccessToken()/verifyAccessToken() 做授权状态检查([华为开发者][3])

✅可复用封装:一行搞定“检查+申请+结果”

import abilityAccessCtrl from '@ohos.abilityAccessCtrl'
import { promptAction } from '@kit.ArkUI'

export async function ensurePermissions(context: any, perms: string[]): Promise<boolean> {
  const atManager = abilityAccessCtrl.createAtManager() // :contentReference[oaicite:4]{index=4}
  try {
    const res = await atManager.requestPermissionsFromUser(context, perms) // :contentReference[oaicite:5]{index=5}
    const ok = res.authResults?.every(r => r === 0) ?? false
    if (!ok) {
      promptAction.showToast({ message: '🥲 没拿到权限,相关功能先歇会儿~' })
    }
    return ok
  } catch {
    promptAction.showToast({ message: '😵 权限请求异常,稍后再试' })
    return false
  }
}

✅“正确姿势”提醒(很关键)

  • 用到再申请(Just-in-time):不要 App 一启动就弹一屏权限,把用户吓跑🏃‍♂️💨
  • 拒绝要有降级方案:给“去设置打开”的引导,不要直接功能全黑屏🙂

🔒 2)数据加密:别把敏感数据当普通字符串随手一存🙅‍♂️

安全存储的核心不是“用了 AES 就万事大吉”,而是三件套:

  1. 密钥怎么安全生成/保存
  2. 数据存哪里更安全
  3. 传输过程怎么防窃听/篡改

2.1 选工具:Crypto Architecture Kit vs HUKS(别用错场景😄)

  • Crypto Architecture Kit:提供加解密、签名验签、哈希、随机数、派生等算法框架,但不负责密钥管理(密钥得你自己安全保管)([华为开发者][4])
  • HUKS(通用密钥库):系统级密钥管理+密码学操作,支持密钥生成/导入/销毁/加解密/签名等全生命周期能力([华为开发者][5])

我个人的“懒人但稳”策略:

  • 长期密钥/关键资产 → 优先 HUKS 管
  • 临时会话密钥/纯算法操作 → Crypto Kit 可以上([华为开发者][4])

2.2 数据存储分区:EL2 优先(别把宝贝放门口😅)

HarmonyOS 在应用数据安全最佳实践里强调了分级数据保护:

  • EL1:设备级加密(开机就可访问)
  • EL2:用户级加密(首次解锁后才能访问,默认推荐)
    通常无特殊需要建议放 EL2,安全性更好([华为开发者][6])

一句话:
你不需要“锁屏也能读到用户隐私”的能力,真的不需要。


2.3 实战示例:HUKS 加密一段敏感文本(示意版,讲思路✅)

注:HUKS API 选项参数较多(算法/用途/填充/权限控制等),项目里建议按你需求固定成工具类,别到处散落“魔法数字”。HUKS 能力本身由官方 API 参考定义([华为开发者][5])

// 伪代码风格:展示“用 HUKS 管密钥 + 做加密”的工程结构
import huks from '@ohos.security.huks' // HUKS API :contentReference[oaicite:11]{index=11}

export class SecureTextBox {
  // 1) 生成/获取密钥(建议:应用初始化时做一次)
  async ensureKey(alias: string) {
    // 这里通常用 huks.generateKey + properties 指定用途:ENCRYPT/DECRYPT
    // 具体 properties 组合请以官方 HUKS 参考为准 :contentReference[oaicite:12]{index=12}
  }

  // 2) 加密
  async encrypt(alias: string, plain: Uint8Array): Promise<Uint8Array> {
    // huks.init -> huks.update -> huks.finish 的典型调用链
    // 返回密文 bytes
    return new Uint8Array()
  }

  // 3) 解密
  async decrypt(alias: string, cipher: Uint8Array): Promise<Uint8Array> {
    return new Uint8Array()
  }
}

如果你希望我把 HUKS 的 properties 按“常见 AES-GCM”完整补齐成可直接运行版本,我可以按你目标 API 版本整理一套“可复制”的参数模板(不同版本/规格差异挺敏感,别硬猜🙂)。


🫥 3)隐私保护:合规不是“写个隐私政策链接”就完事了📜

3.1 三个底线原则(我写需求评审必问😄)

  • 最小化:只收集功能必需数据(能用城市就别要精确定位)
  • 透明告知:收集什么、为什么、怎么用、存多久
  • 用户可控:随时撤回授权、删除数据、关闭个性化等

做不到这三条,功能再酷也像“在玻璃上跳舞”——迟早摔🙂

3.2 “首次启动隐私弹窗”:别等审核卡你才想起🥲

很多上架要求会关注“首次启动告知同意”。官方开发者博客也有专门分享实现思路(例如 CustomDialog + 状态持久化)([华为开发者][7])
建议逻辑:

  • 未同意:只展示隐私弹窗(可查看详情)
  • 同意:记录标记(Preferences 等)再进入主流程
  • 不同意:退出或进入受限模式(别硬进主功能😅)

✅ 4)安全开发最佳实践:别把“安全”当收尾项🚧

4.1 权限最佳实践(最常见也最容易翻车)

  • 按功能拆权限:拍照只要 Camera,就别顺手要位置
  • 用到再申请:按钮点到那一步才弹窗
  • 失败可用:拒绝后提供替代方案或明确提示
  • 别反复骚扰:用户拒绝了还一直弹,真的会被拉黑🙂

4.2 数据安全最佳实践(让你少掉头发🧑‍🦲)

HarmonyOS 应用数据安全最佳实践里强调了数据分级、加密目录、关键资产保护等思路([华为开发者][6])
落地建议:

  • 敏感数据默认不落盘(能内存就内存)
  • 必须落盘:优先 EL2 + 二次加密(密钥走 HUKS)([华为开发者][6])
  • 日志/埋点:脱敏(手机号只留后四位、Token 打码)

4.3 网络与接口安全(别让 HTTPS 变摆设😅)

  • 全链路 HTTPS
  • 对关键接口做签名/时间戳/重放防护
  • 对敏感操作做二次确认(尤其是删除/支付类)

🧪 5)一个“可落地”的小模板:权限 + 敏感数据存储(组合拳🥊)

5.1 用户点击“获取定位”按钮时:先权限,再业务

import { ensurePermissions } from './PermissionKit'

async function onClickGetLocation(context: any) {
  const ok = await ensurePermissions(context, ['ohos.permission.LOCATION'])
  if (!ok) return
  // ✅ 权限 OK 才执行定位逻辑(别先干活后补票😅)
}

5.2 存 Token/密钥这类“关键资产”:别用明文 Preferences

  • Preferences 适合“开关/偏好”,不适合存敏感凭据
  • 关键资产:建议 HUKS 管密钥 + 加密落盘(或使用系统提供的关键资产保护能力)

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」专栏(全网一个名),bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

我是bug菌(全网一个名),CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云多年度十佳博主/价值贡献奖,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击这里;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

-End-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。