HarmonyOS 应用安全开发:权限控制与隐私合规上架
HarmonyOS 应用安全开发,涵盖权限动态申请、敏感数据加密存储(EncryptedKVStore/HUKS)、HTTPS 证书校验及隐私合规流程。通过健康医疗应用案例,演示如何构建符合《个人信息保护法》的高安全架构,并提供 AppGallery 审核避坑清单,助力开发者安全上架。

HarmonyOS 应用安全开发,涵盖权限动态申请、敏感数据加密存储(EncryptedKVStore/HUKS)、HTTPS 证书校验及隐私合规流程。通过健康医疗应用案例,演示如何构建符合《个人信息保护法》的高安全架构,并提供 AppGallery 审核避坑清单,助力开发者安全上架。

随着《个人信息保护法》《数据安全法》的实施,以及华为 AppGallery 对应用安全性的日益严苛审核,'能跑'已远远不够,'安全合规'才是上线的前提。
在 HarmonyOS 生态中,安全不是附加功能,而是内置于系统架构的核心能力。从最小权限原则、沙箱隔离,到分布式数据加密、TEE 可信执行环境,HarmonyOS 为开发者提供了多层次防护体系。
然而,若开发者不了解其安全机制,轻则被用户投诉'过度索取权限',重则因隐私违规被下架。
本文将系统性地讲解:
并通过一个'健康医疗类应用'实战案例,手把手教你构建符合监管要求的高安全应用。
HarmonyOS 将权限分为三类:
| 类型 | 示例 | 用户可见 | 是否需动态申请 |
|---|---|---|---|
| Normal | 网络访问 | ❌ | 否(安装即授) |
| Signature | 系统级能力 | ❌ | 否(仅同签名可用) |
| Dangerous | 位置、相机、通讯录 | ✅ | 是(必须运行时申请) |
⚠️ 关键规则:所有
ohos.permission.*中标记为 'user_grant' 的权限,都属于 Dangerous 权限,必须通过requestPermissionsFromUser动态申请。
// pages/HealthRecord.ets
import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
@Entry
@Component
struct HealthRecordPage {
private atc = abilityAccessCtrl.createAtm();
async requestLocationPermission() {
try {
const result = await this.atc.requestPermissionsFromUser(getContext(this), ['ohos.permission.LOCATION']);
if (result.authResults[0] === 0) {
// 用户授权,开始定位
this.startLocationTracking();
} else {
// 用户拒绝,降级处理(如手动输入城市)
this.showManualInput();
}
} catch (err) {
console.error('Permission request failed:', err);
}
}
build() {
Column() {
Button('记录当前位置健康数据').onClick(() => this.requestLocationPermission())
}
}
}
✅ 最佳实践:提前说明用途:在弹窗前用文案解释'为何需要位置'(如'用于匹配本地疫情风险等级');提供替代方案:用户拒绝后,允许手动输入或跳过;避免频繁弹窗:若用户选择'不再询问',应引导至系统设置页开启。
对于账号密码、健康数据等,绝不能明文存 Preferences 或 RDB。应使用加密 KV 存储:
// common/SecureStorage.ts
import kvStore from '@ohos.data.kvStore';
import { BusinessError } from '@ohos.base';
let secureStore: kvStore.KVStore | null = null;
export async function initSecureStore(): Promise<void> {
const config: kvStore.Options = {
createIfMissing: true,
encrypt: true, // 关键:启用加密
backup: false, // 加密数据不参与云备份
kvStoreType: kvStore.KVStoreType.SINGLE_VERSION
};
try {
secureStore = await kvStore.getKVStore('secure_health_data', config);
} catch (err) {
throw new BusinessError(`Failed to init secure store: ${err}`);
}
}
export async function saveHealthToken(token: string): Promise<void> {
if (!secureStore) await initSecureStore();
await secureStore.put('health_token', token);
}
export async function getHealthToken(): Promise<string | null> {
if (!secureStore) await initSecureStore();
return await secureStore.get('health_token');
}
🔒 加密原理:数据使用设备级密钥加密,即使 root 也无法直接读取。
对于金融、政务类应用,可调用 Huawei Universal Keystore System (HUKS) 实现:
// 使用 @ohos.security.huks 进行 RSA 签名
import huks from '@ohos.security.huks';
const properties: huks.HuksParam[] = [
{ tag: huks.HuksTag.HUKS_TAG_ALGORITHM, uint32Param: huks.HuksAlgorithm.HUKS_ALG_RSA },
{ tag: huks.HuksTag.HUKS_TAG_KEY_SIZE, uint32Param: huks.HuksKeySize.HUKS_RSA_KEY_SIZE_2048 }
];
await huks.generateKeyItem('my_rsa_key', properties);
const signature = await huks.sign('my_rsa_key', { data: 'sensitive_data' });
💡 提示:HUKS 需在
module.json5中声明ohos.permission.USE_HUKS。
HarmonyOS 默认禁止 HTTP 明文通信(除非在 module.json5 中显式允许)。
但仅用 HTTPS 仍可能遭遇中间人攻击(MITM)。应启用 证书锁定(Certificate Pinning):
// network/SecureHttpClient.ts
import http from '@ohos.net.http';
const EXPECTED_PUBLIC_KEY = 'sha256/AAAAAAAA...'; // 服务器公钥指纹
export function createSecureRequest(url: string): http.HttpRequest {
const request = http.createHttp();
// 设置 SSL 配置(HarmonyOS 4.0+ 支持)
request.setSSLCustomTrust({
onVerifyPeer: (certChain: string[]) => {
const actual = computePublicKeyHash(certChain[0]);
return actual === EXPECTED_PUBLIC_KEY;
}
});
return request;
}
⚠️ 注意:HarmonyOS 当前(API 10)对自定义证书校验支持有限,建议:使用 华为 HMS Core 的 Safety Detect 服务检测网络风险;敏感接口增加 二次签名验证(如 HMAC-SHA256)。
根据中国《App 违法违规收集使用个人信息行为认定方法》,你的隐私政策必须包含:
📄 模板建议:在应用'关于'页面提供链接,并在首次启动时弹出同意框。
| 问题 | 解决方案 |
|---|---|
| 未提供隐私政策链接 | 在 AGC 后台填写 URL,并在应用内可访问 |
| 申请无关权限(如游戏要通讯录) | 移除非必要权限,或提供合理说明 |
| 敏感数据明文存储 | 改用 EncryptedKVStore 或 HUKS |
| 未处理权限拒绝场景 | 提供降级功能或引导开启 |
| SDK 未声明 | 在 AGC 的 |

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online