HarmonyOS 7 新特性(三十二)|星盾机密风控:数据可用不可见

HarmonyOS 7 的安全能力不再局限于“检测设备是否 Root”或“返回一个风险分”。星盾机密风控引擎与机密空间强调的是:多个风险因子可以在隔离环境中参与计算,业务只获得必要结果,原始隐私数据不需要暴露给普通应用进程。
这类能力很适合银行转账、支付确认、账号找回和高价值权益领取,但接入方式与普通 SDK 完全不同。本文讨论如何从威胁模型、数据最小化、机密计算、策略版本和灰度回退建立一套可审计的风控链路。
一、先写清楚威胁模型
安全项目最常见的问题,是先接入接口再解释要解决什么风险。建议把攻击者能力、目标资产、信任边界和可接受失败方式写成文档。
interface ThreatModel {
asset: 'transfer' | 'account-recovery' | 'coupon'
attackers: Array<'malware' | 'automation' | 'stolen-device' | 'social-engineering'>
trusted: Array<'tee' | 'server-policy' | 'user-confirmation'>
failMode: 'deny' | 'step-up' | 'manual-review'
}
机密计算不能替代业务规则,也不能消除社会工程。它解决的是风险因子融合过程中“数据可用不可见”和计算环境隔离问题。
二、普通进程只保留最小上下文
应用进程不应采集与交易无关的联系人、相册或完整设备轨迹。进入机密空间的数据也要遵守目的限定、最小化与保留期限。客户端只准备交易挑战和必要上下文。
type RiskRequest = {
requestId: string
challenge: string
scene: 'TRANSFER'
amountBucket: 'LOW' | 'MEDIUM' | 'HIGH'
createdAt: number
policyVersion: string
}
金额可按业务需要分桶,避免在非必要链路传播精确值。用户身份、账户余额等敏感信息应使用不可逆标识或由服务端在受控环境完成关联。
三、把机密空间理解为数据应用
官方文档将机密空间描述为对外隔离的计算环境,数据应用可以接收外部输入并执行逻辑,但向外输出受到严格管控。设计时应把它当成一个窄输入、窄输出的独立程序,而不是普通函数调用。
interface ConfidentialRiskInput {
challengeHash: Uint8Array
deviceSignalsRef: string
policyDigest: string
}
interface ConfidentialRiskOutput {
decision: 'ALLOW' | 'STEP_UP' | 'DENY'
reasonCodes: string[]
evidenceDigest: string
expiresAt: number
}
输出不要包含原始风险因子。reasonCodes 应是稳定枚举,用于业务决策和审计,而不是泄露模型特征的详细解释。

四、端云职责要分开
端侧适合收集即时设备风险并在可信环境融合,服务端负责账户历史、交易网络和全局策略。最终决策必须绑定同一个请求挑战,避免攻击者把低风险结果重放到另一笔交易。
function verifyRiskResult(result: SignedRiskResult, req: RiskRequest): boolean {
if (result.requestId !== req.requestId) return false
if (result.challenge !== req.challenge) return false
if (Date.now() > result.expiresAt) return false
return verifySignature(result.payload, result.signature)
}
挑战值必须一次性使用。服务器保存已消费的 requestId,重复请求直接拒绝或重新评估。
五、策略需要版本化和可回滚
风控规则不是写死在客户端的 if。策略应包含版本、适用应用版本、场景、阈值、有效期和回滚版本。客户端和机密数据应用都要验证策略摘要。
interface RiskPolicy {
version: string
minAppVersion: number
scenes: string[]
thresholds: Record<string, number>
validFrom: number
validUntil: number
rollbackTo?: string
}
当线上拒绝率异常时,应能关闭某个因子、切换“拒绝”为“增强认证”,而不是紧急发版。
六、结果不是一个万能分数
单一 0~100 分数难以解释,也容易被不同业务错误复用。更稳妥的方式是返回有限决策和稳定原因码,然后由场景策略映射下一步动作。
function nextAction(output: ConfidentialRiskOutput): 'PASS' | 'TUI_AUTH' | 'REVIEW' {
if (output.decision === 'ALLOW') return 'PASS'
if (output.decision === 'STEP_UP') return 'TUI_AUTH'
return output.reasonCodes.includes('DEVICE_COMPROMISED') ? 'REVIEW' : 'TUI_AUTH'
}
高风险不等于立即封禁。对误报代价高的场景,增强认证和人工复核通常比直接拒绝更合理。
七、失败必须安全但可用
机密空间暂不支持模拟器,且能力可能受设备、地区、资质或网络条件限制。应用启动时不要假设服务一定可用,应该有明确能力探测和失败矩阵。
type RiskAvailability =
| { state: 'READY' }
| { state: 'UNSUPPORTED'; fallback: 'SERVER_RISK' }
| { state: 'TEMPORARY_ERROR'; fallback: 'STEP_UP_AUTH' }
| { state: 'POLICY_EXPIRED'; fallback: 'DENY_HIGH_VALUE' }
高价值交易可以在关键能力不可用时转增强认证或限额,低风险业务可回退服务端规则。不要在异常时默认放行。
八、日志只记录审计证据
安全日志应包含请求 ID、策略版本、决策、原因码、耗时和能力状态,不应包含原始设备指纹、用户输入或模型特征。调试日志与生产日志分级。
const audit = {
requestId,
policyVersion,
decision: output.decision,
reasonCodes: output.reasonCodes,
durationMs,
engine: 'confidential-risk'
}
对外客服查询只能看到业务可解释信息,不能把安全策略细节暴露给攻击者。
九、防止探测和旁路
攻击者可能重复改变少量输入,观察决策差异以推断阈值。需要限制请求频率、绑定会话、对原因码做最小化,并在服务端识别异常探测模式。
所有“无需风控”的旁路都要审计,包括内部账号、测试环境、补偿任务和客服工具。测试开关不能进入生产包,白名单必须有过期时间和审批人。
十、验证不能只测正常交易
测试矩阵至少覆盖:能力不支持、策略过期、签名错误、挑战重放、时钟偏差、弱网、机密空间启动失败、服务端超时、应用被杀和重复点击。攻击测试还应覆盖篡改请求、Hook 普通进程、替换策略和批量探测。
指标包括放行率、增强认证率、拒绝率、人工复核率、误报申诉、接口 P95/P99、不同设备覆盖率和回退占比。任何版本都要按人群和场景分层观察。
十一、上线门禁
- 威胁模型和失败代价已评审;
- 输入、输出和保留期限符合最小化原则;
- 原始风险因子不离开受控环境;
- 每次结果绑定一次性挑战与策略版本;
- 高风险结果映射增强认证或人工复核;
- 不支持、超时和策略过期均有安全回退;
- 日志不包含原始隐私数据和模型细节;
- 灰度指标、熔断开关与回滚策略可用。

结语
星盾机密风控的核心不是“得到更高的风险分”,而是改变风险数据被处理的方式。将原始因子留在隔离空间,把外部输出限制为可审计的决策,再用一次性挑战、版本化策略和安全回退连接端云,才能同时守住隐私、可用性与业务安全。
官方参考
- Device Security Kit:https://developer.huawei.com/consumer/cn/doc/doccenter-capabilities/device-security-kit-guide
- Confidential Space Kit 简介:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/confidentialspace-introduction
- HarmonyOS 7 新能力一览:https://developer.huawei.com/consumer/cn/features/
更多推荐



所有评论(0)