Appearance
应用安全模型
鸿蒙应用沙箱、签名验证、应用隔离机制。
1. 应用沙箱
1.1 沙箱架构
应用沙箱(Sandbox)
┌─────────────────────────────────────┐
│ 应用 A │
│ ┌─────────────┐ │
│ │ 私有数据 │ │
│ │ /data/storage/el2/base/com.app.A │
│ │ - files/ │ │
│ │ - cache/ │ │
│ │ - rdb/ │ │
│ │ - preferences/ │
│ └─────────────┘ │
│ 无法访问应用 B 的数据 │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 应用 B │
│ ┌─────────────┐ │
│ │ 私有数据 │ │
│ │ /data/storage/el2/base/com.app.B │
│ └─────────────┘ │
└─────────────────────────────────────┘1.2 沙箱特性
| 特性 | 说明 | |---|-|-| | 数据隔离 | 应用间数据不可见 | | 权限隔离 | 每个应用独立权限集 | | 进程隔离 | 应用运行在独立进程 | | 文件隔离 | 沙箱外文件需授权访问 |
2. 应用签名
2.1 签名验证流程
应用开发
↓
生成密钥对(私钥 + 证书)
↓
使用私钥签名应用
↓
应用安装时验证签名
↓
验证通过 → 安装成功
验证失败 → 安装拒绝2.2 签名配置
json5
// build-profile.json5
{
"app": {
"signingConfigs": [
{
"name": "release",
"type": "HarmonyOS",
"material": {
"certpath": "/path/to/release.cer",
"storePassword": "password",
"keyAlias": "alias",
"keyPassword": "password"
}
}
],
"products": [
{
"name": "release",
"signingConfig": "release"
}
]
}
}2.3 签名权限
签名权限(signature permission):
├─ 同签名应用自动授予
├─ 用于应用间共享数据/能力
└─ 防止恶意应用冒充3. 应用隔离
3.1 进程隔离
每个应用独立进程:
├─ 应用崩溃不影响其他应用
├─ 内存隔离
├─ CPU 资源隔离
└─ 文件描述符隔离3.2 能力隔离
typescript
// 应用只能访问自己声明的能力
import { bundleManager } from '@kit.ArkTS'
// 获取自身信息
let bundleInfo = await bundleManager.getBundleInfoForSelf({
flags: bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION
})
console.log('应用名:', bundleInfo.name)
console.log('TokenID:', bundleInfo.appInfo.tokenId)
// 无法直接访问其他应用的私有数据
// 必须通过公开 API 或授权4. 安全启动
4.1 启动链验证
BootROM → BootLoader → Kernel → System → Application
↓ ↓ ↓ ↓ ↓
签名验证 签名验证 签名验证 签名验证 签名验证5. 面试高频考点
Q1: 鸿蒙应用沙箱的作用?
回答:数据隔离、权限隔离、进程隔离。每个应用只能访问自己的沙箱数据,无法访问其他应用数据。
Q2: 应用签名验证流程?
回答:开发时生成密钥对并签名 → 安装时系统验证签名 → 验证通过才允许安装。
🐱 小猫提示:应用安全记住 "沙箱隔离、签名验证、进程隔离、能力隔离"。