处理用户数据在 Capacitor 应用中需要安全存储、清晰的保留政策以及遵守数据保护法规如 GDPR 和 CCPA. 本指南解释了如何最小化数据收集、安全存储敏感信息以及有效管理权限。以下是一些快速概述:
- 数据最小化: 只收集必要的特定应用功能。
- 安全存储: 使用工具如
@capacitor/secure-storage插件进行加密。 - 数据保留期: 根据定义的时间限制自动删除。
- 用户权限: 启用用户访问、删除或导出的数据。
- 权限管理: 在请求被拒绝时提供替代方案,根据上下文请求权限。
- OTA 更新: 使用工具如 Capgo.
如何使用Ionic Capacitor 安全存储

减少数据收集
遵守隐私法规的关键是采取结构化的方法来审查、规划和管理数据收集。通过利用Capacitor内置的工具来减少数据收集,您可以采取实际步骤来改善您的应用程序的数据实践。
数据收集审查
首先,通过映射出数据如何在您的应用程序中流动。使用数据流向可视化工具来找出可能收集了不必要的数据的区域。隐私影响评估(PIA)软件可以指导您评估每个数据项是否真正需要。以下是需要关注的领域:
| 数据类型 | 审查重点 | 行动项 |
|---|---|---|
| 用户输入 | 表单字段和验证 | 移除不必要的字段 |
| API 调用 | 请求/响应负载 | 过滤掉额外的数据字段 |
| 存储 | 缓存和持久数据 | 优化存储使用 |
| 分析 | 使用跟踪 | 只保留关键指标 |
数据收集目标
明确每个数据点的收集目的。每个数据点都应为特定目的服务。例如:
// Purpose-driven data collection example
const userPreferences = {
location: "Used for local weather updates",
notification: "Needed for sending alerts"
};
如果您的应用程序具有天气功能,则可能只需要一个邮政编码code而不是完整的地址。这一方法确保您只收集必要的信息来支持核心应用程序功能[1][5].
数据输入控件
使用验证工具来限制通过表单和API调用的数据收集量。将客户端验证与服务器端验证结合起来,以有效地强制这些限制
在这些控件中,集成Capacitor的安全功能
- 在可能的情况下使用下拉菜单代替自由文本字段
- 为文本输入字段设置字符限制
定期(每季度)使用自动发现工具进行审计,以确保您的数据收集实践与应用程序的预期功能保持一致
数据安全和存储
一旦您定义了数据收集边界,必须实施措施来保护用户信息,同时遵守数据最小化原则
设置安全存储
The @capacitor/secure-storage 插件使用内置的安全功能,如 iOS Keychain 和 Android Keystore,来保护敏感数据 [1].
import { SecureStorage } from '@capacitor/secure-storage';
// Store sensitive data
await SecureStorage.set({
key: 'authToken',
value: 'user-specific-token'
});
// Retrieve stored data
const { value } = await SecureStorage.get({ key: 'authToken' });
数据加密方法
在客户端加密是另一种保护措施。类似于 CryptoJS 的库可以帮助加密敏感信息:
// Basic encryption/decryption implementation
const encryptData = (data: string, key: string): string => {
return CryptoJS.AES.encrypt(data, key).toString();
};
定期轮换加密密钥是提高安全性的聪明方法。这确保即使一个密钥被破坏,数据仍然安全 [2].
比较存储选项
选择合适的存储解决方案取决于数据的敏感程度。以下是快速比较:
| 功能 | 安全存储 | 本地存储 |
|---|---|---|
| 安全级别 | 高级(加密) | 基本 |
| 适合 | 令牌、密码 | 非敏感设置 |
| 性能 | 较慢(加密原因) | 更快的访问 |
Secure Storage API 是存储关键信息,如身份验证令牌和个人用户数据的坚实选择 [1][4]。它的 加密功能 也符合保留政策,允许在指定时间框架内控制访问数据 [2].
sbb-itb-f9944d2
数据存储时间限制
明确数据保留政策有助于与数据最小化原则保持一致,确保信息不会保留得比必要的时间长。
存储时间规则
不同类型的用户数据应该根据其目的和敏感度水平来定义保留期限。以下是一种管理数据保留的建议框架 Capacitor 应用:
| 数据类型 | 保留期限 | 理由 |
|---|---|---|
| 账户数据 | 直到账户删除或 2 年内无活动 | 用于账户相关操作 |
| 交易记录 | 7年 | 遵守金融法规 |
| 分析数据 | 90天(匿名化),1年(删除) | 支持功能改进 |
| 营销偏好 | 直到取消或帐户删除 | 遵守同意要求 |
以下是如何使用过期日期存储数据的示例:
async function storeDataWithExpiration(key: string, value: any, retentionDays: number) {
const item = {
value: value,
expiration: Date.now() + (retentionDays * 24 * 60 * 60 * 1000)
};
await Preferences.set({ key, value: JSON.stringify(item) });
}
自动数据删除
Capacitor的背景抓取功能可以帮助自动化数据清理,保持合规并减少手动干预:
import { BackgroundFetch } from '@capacitor/background-fetch';
BackgroundFetch.registerTask({
taskId: 'data-cleanup',
delay: 3600000,
periodic: true,
requiresNetworkConnectivity: false
}, async () => {
await cleanExpiredData();
return BackgroundFetch.Result.NewData;
});
If you’re using __CAPGO_KEEP_0__ for storage, you can set up triggers to automatically delete expired records: SQLite for
CREATE TRIGGER remove_expired_data
AFTER INSERT ON user_data
BEGIN
DELETE FROM user_data
WHERE expiration_date < CURRENT_TIMESTAMP;
END;
User Data Removal Options
为用户提供管理他们数据的工具至关重要。以下是您可以实施的两项关键功能:
- Delete Specific Data: 允许用户删除与其账户相关的特定数据类型。
async function deleteSpecificData(userId: string, dataType: string) {
await Preferences.remove({ key: `${userId}_${dataType}` });
if (db) {
await db.run(
'DELETE FROM user_data WHERE user_id = ? AND data_type = ?',
[userId, dataType]
);
}
}
- Export User Data: 允许用户下载其存储的数据以结构化的格式。
async function exportUserData(userId: string) {
// Gathers all user data for export
const userData = await collectUserData(userId);
return JSON.stringify(userData);
}
法国数据保护机构 CNIL 强调了存储期限必须与应用程序的核心功能相一致。 [3]. 这一原则尤其适用于 Capacitor 应用程序开发人员,并应指导您的数据保留策略。
App 权限控制
Handling app permissions carefully is key to safeguarding user data while ensuring your app functions as intended. By managing permissions properly, you can limit access to only the device features your app truly needs. Capacitor’s Permissions API offers a unified approach to managing permissions on both iOS and Android.
__CAPGO_KEEP_0__ 的权限 __CAPGO_KEEP_1__ 提供了一个统一的权限管理方法,适用于 iOS 和 Android。
Make sure the permissions you request align with your app’s data collection goals. Here’s a sample implementation for handling permission requests in a Capacitor app:
import { Permissions } from '@capacitor/core';
const permissionHandler = async (permissionType: string) => {
const status = await Permissions.query({ name: permissionType });
if (status.state === 'granted') {
return true;
}
const shouldProceed = await showExplanationDialog(
`We need ${permissionType} access to provide core functionality`
);
if (shouldProceed) {
const result = await Permissions.request({ name: permissionType });
return result.state === 'granted';
}
return false;
};
确保您请求的权限与应用程序的数据收集目标相符。以下是 __CAPGO_KEEP_0__ 应用程序处理权限请求的示例实现:
管理被拒绝的权限
const handleDeniedPermission = async (permissionType: string) => {
const status = await Permissions.query({ name: permissionType });
if (status.state === 'denied') {
const alternatives = {
camera: 'manual photo upload',
location: 'manual address entry',
notifications: 'in-app message center'
};
showAlternativeFeature(alternatives[permissionType]);
if (status.canOpenSettings) {
offerSettingsRedirect();
}
}
};
如果用户拒绝权限请求,请提供明确的替代方案和指导。以下是示例:
权限请求的时机
| 您何时请求权限至关重要。战略性地选择时机可以显著提高用户接受率。以下是时机策略的快速概述: | 时机策略 |
|---|---|
| 最佳用例 | For specific features when needed |
| 上下文相关 | For non-critical features |
| 首次启动 | For core features required upfront |
| 延迟 | For optional features later in the user journey |
例如,您可以在用户触发相机拍照动作时请求相机访问:
const captureImage = async () => {
const userStartedCapture = true;
if (userStartedCapture) {
const granted = await permissionHandler('camera');
if (granted) {
await startCamera();
} else {
showUploadOption();
}
}
};
上下文请求,如此可以提高接受率达 50% 相比于提前请求 [2]. 确保用户体验顺畅,维护一个保存用户决策的权限状态跟踪器,跨会话保存用户决策
一旦权限处理完成,您可以将重点转移到确保更新,尤其是对于无线(OTA)部署
OTA 更新安全性
为了确保数据完整性在 app更新,使用安全的OTA(Over-The-Air)更新过程至关重要。这些更新有助于防止未经授权的更改对应用程序code,否则可能绕过数据收集的限制。
更新包签名
签署更新包是保护免受未经授权code更改的关键步骤。以下是安全的OTA更新的关键措施:
| 安全措施 | 如何做到 |
|---|---|
| 内容保护 | AES加密 |
| 交付安全 | HTTPS与证书固定 |
| 更新完整性 | __CAPGO_KEEP_0__ |
| 安全版本 | 已签名的版本号 |
| 失败恢复 | 即时回滚功能 |
Capgo 更新系统

Capgo 简化了 Capacitor 应用的安全 OTA更新流程,提供了自动化安全功能。以下是一个使用 Capgo 更新系统的示例:
import { CapacitorUpdater } from '@capgo/capacitor-updater';
const secureUpdate = async () => {
try {
const update = await CapacitorUpdater.download({
version: 'latest',
validateSignature: true
});
if (update.status === 'success') {
await CapacitorUpdater.set(update);
}
} catch (error) {
await CapacitorUpdater.rollback();
}
};
此方法确保更新是经过验证和安全的,并且在失败时提供回滚选项。
遵守应用商店政策是 OTA 更新的必要条件
遵守应用商店指南是 OTA 更新的必要条件[1][6][7]每个平台都有特定的要求,以确保更新与其数据保留和安全政策保持一致:
| 平台 | 合规要求 |
|---|---|
| iOS | 仅支持 JavaScript 或资源更新 |
| Android | 必须获得用户同意 |
| Both | 安全检查和适当的文档 |
以下是实现符合存储要求的更新的示例:
const compliantUpdate = async () => {
const userConsent = await requestUpdateConsent();
if (userConsent) {
await CapacitorUpdater.setUpdateConfig({
type: 'assets-only',
scope: 'ui-updates' // Updates limited to UI components
});
}
};
const preventDowngrade = async (newVersion, currentVersion) => {
const versions = await CapacitorUpdater.getVersions();
if (versions.current.buildNumber > newVersion.buildNumber) {
throw new Error('Downgrade attempt detected');
}
};
概要
关键点
有效地处理用户数据涉及结合这些核心策略:
- 只收集必要的数据。
- 使用平台原生的加密方式来保护数据。
- 自动化数据保留截止日期。
- 设置详细的权限控制。
这些步骤共同确保从数据收集的那一刻开始,直到自动删除为止,所有的合规性都得到保障。
实施步骤
为了将这些策略付诸实践:
- 使用第 2 节中讨论的方法对数据流进行审计。
- 根据第 3 节中所述,增强存储安全性。
- 根据第 4 节建立并自动化删除过程。
- 根据第 5 节建立并强制执行权限控制。
依赖于 Capgo
对于管理 OTA 更新的团队,Capgo 提供了内置的安全工具,旨在与这些努力保持一致:
- 端到端加密 以安全更新包
- 实时监控 快速解决潜在的安全威胁
继续阅读如何在 Capacitor 应用程序中处理用户数据
如果您正在使用 如何在 Capacitor 应用程序中处理用户数据 以规划安全性和合规性 将其与 加密 合规 对于合规的实现细节 Capgo 安全扫描器 对于Capgo 安全扫描器的产品工作流程 Capgo 安全 对于Capgo 安全的产品工作流程 Capgo 信任中心 对于Capgo 信任中心的产品工作流程