引言
在金融、政务、能源等关键领域,国产化应用不仅要求功能完备,更需通过等保三级、密评、安全审计等严格认证。而 OpenHarmony + Flutter 混合架构因其“双运行时 + 双代码库”特性,面临独特的安全风险:
- Dart 代码可被反编译(虽无源码,但逻辑可还原);
- MethodChannel 参数明文传输,易被 Hook 篡改;
-
敏感数据缓存在
shared_preferences或本地文件,未加密; - HAP 包未签名或签名弱,可被重打包植入恶意代码。
若不系统性加固,应用将成“透明盒子”。本文将从 代码保护、通信安全、存储加密、运行环境检测 四大维度,提供一套可落地的全链路安全方案,并附完整代码示例。
一、代码混淆与防逆向
1. OpenHarmony(ArkTS)层混淆
OpenHarmony 支持 ETS 代码混淆(Obfuscation),通过 build-profile.json5 配置:
// openharmony_app/build-profile.json5
{
"app": {
"products": [
{
"name": "default",
"runtimeOS": "OpenHarmony",
"buildOption": {
"arkOptions": {
"obfuscation": {
"ruleOptions": {
"enable": true,
"files": ["obfuscation-rules.txt"]
}
}
}
}
}
]
}
}
obfuscation-rules.txt(保留必要接口):
# 保留 EntryAbility 入口
-keep class EntryAbility { *; }
# 保留 MethodChannel 回调方法
-keepclassmembers class * {
public *** onMethodCall(...);
}
# 保留设备管理相关类(如使用分布式能力)
-keep class ohos.distributedHardware.** { *; }
✅ 效果:ArkTS 编译后的
.abc字节码变量名变为a,b,c,大幅提升逆向难度。
2. Flutter(Dart)层保护
Dart 虽为 AOT 编译,但仍可通过 IDA Pro / Ghidra 分析 libflutter.so 中的逻辑。缓解措施:
✅ 启用 Release 构建(默认已优化)
flutter build ohos --release
- 移除调试符号;
- 启用编译器优化(Oz)。
✅ 关键逻辑下沉至 OpenHarmony 原生层
例如:将加解密、Token 生成等核心算法用 ArkTS 实现,通过 MethodChannel 调用,避免 Dart 层暴露。
✅ 使用字符串加密(防静态分析)
对硬编码的 URL、Key 等进行简单异或或 Base64 拆分:
String _decrypt(String encoded) {
// 实际项目建议使用原生加解密插件
return String.fromCharCodes(
base64Decode(encoded).map((c) => c ^ 0x5A)
);
}
final apiUrl = _decrypt('WkdGMFlXeHBibUZz'); // 解密后为 "https://api.example.***"
⚠️ 注意:此仅为初级防护,高安全场景必须依赖原生加密。
二、MethodChannel 通信安全
风险
攻击者可通过 Frida / Xposed Hook MethodChannel,篡改请求参数或返回值。
防护方案
✅ 1. 参数签名验证
在 OpenHarmony 端对关键调用进行签名校验:
// SecurityUtils.ts
import crypto from '@ohos.security.cryptoFramework';
export function verifySignature(data: string, signature: string, publicKey: string): boolean {
try {
const asymKeyGenerator = crypto.createAsyKeyGenerator('RSA');
const pubKey = asymKeyGenerator.convertKey(publicKey, 'PKCS8');
const signer = crypto.createSign('SHA256withRSA');
signer.init(crypto.SignMode.VERIFY, pubKey);
signer.update({ data: util.stringToUint8Array(data) });
return signer.verify(util.stringToUint8Array(signature));
} catch (e) {
return false;
}
}
Flutter 端调用前签名(私钥存储在安全环境):
final payload = jsonEncode({'userId': 123});
final sig = await OHSecurity.sign(payload); // 调用原生签名插件
OHChannel.invokeMethod('secureAction', {'data': payload, 'sig': sig});
✅ 2. 敏感操作二次确认
对支付、删除等操作,在 OpenHarmony 弹出系统级确认框:
// EntryAbility.ts
if (call.method === 'deleteA***ount') {
// 弹出系统确认对话框(无法被 Flutter 模拟)
promptAction.showDialog({
title: '确认删除',
message: '此操作不可恢复',
buttons: [{ text: '取消' }, { text: '确定', type: DialogButtonType.POSITIVE }]
});
}
三、本地数据加密存储
问题
shared_preferences 和普通文件以明文存储,root 后可直接读取。
解决方案:使用 OpenHarmony 安全存储能力
✅ 1. 敏感数据存入 @ohos.data.relationalStore + 加密
// SecureStorage.ts
import relationalStore from '@ohos.data.relationalStore';
import security from '@ohos.security.huks'; // 华为通用密钥库服务
const DB_NAME = 'secure.db';
async function encryptAndSave(key: string, value: string) {
// 1. 生成或获取密钥(存储在 HUKS 中)
const keyAlias = 'APP_DATA_KEY';
await security.generateKeyItem(keyAlias, {
purpose: security.HuksKeyPurpose.HUKS_KEY_PURPOSE_ENCRYPT |
security.HuksKeyPurpose.HUKS_KEY_PURPOSE_DECRYPT,
algorithm: security.HuksAlgorithm.HUKS_ALG_AES,
keySize: security.HuksKeySize.HUKS_AES_KEY_SIZE_256,
padding: security.HuksPadding.HUKS_PADDING_PKCS7,
blockMode: security.HuksBlockMode.HUKS_MODE_CBC
});
// 2. 加密数据
const encrypted = await security.encrypt(keyAlias, { data: stringToUint8Array(value) });
// 3. 存入数据库
const store = await relationalStore.getRdbStore(this.context, { name: DB_NAME });
await store.insert('secure_data', {
key: key,
value: uint8ArrayToString(encrypted)
});
}
✅ 2. Flutter 层封装安全存储插件
// secure_storage.dart
class SecureStorage {
static const _channel = MethodChannel('***.example.secure_storage');
static Future<void> write(String key, String value) async {
await _channel.invokeMethod('write', {'key': key, 'value': value});
}
static Future<String?> read(String key) async {
final result = await _channel.invokeMethod('read', {'key': key});
return result as String?;
}
}
// 使用
await SecureStorage.write('auth_token', 'eyJhbGciOiJIUzI1NiIs...');
final token = await SecureStorage.read('auth_token');
🔒 优势:密钥由 HUKS 管理,即使 root 也无法导出;数据加密后存入 SQLite,双重保障。
四、运行环境安全检测
防止应用在模拟器、Root 设备、调试环境中运行。
✅ 1. 检测调试状态(OpenHarmony)
// SecurityCheck.ts
import bundle from '@ohos.bundle.bundleManager';
async function isDebugBuild(): Promise<boolean> {
const info = await bundle.getBundleInfoForSelf(bundle.BundleFlag.GET_BUNDLE_INFO_WITH_HAP_MODULE);
return info.hapModuleInfos?.[0]?.debuggable === true;
}
function checkDebugger() {
if (isDebugBuild()) {
console.error('❌ 检测到调试版本,强制退出');
process.exit(1);
}
}
✅ 2. 检测模拟器/虚拟机
通过读取系统属性判断:
import systemParameter from '@ohos.systemParameter';
function isEmulator(): boolean {
const brand = systemParameter.getSync('const.product.brand', '');
const manufacturer = systemParameter.getSync('const.product.manufacturer', '');
return brand.includes('EMU') || manufacturer.includes('Genymotion');
}
✅ 3. 完整性校验(防重打包)
计算 HAP 包签名哈希并与内置值比对:
import bundle from '@ohos.bundle.bundleManager';
async function verifySignature() {
const cert = await bundle.getBundleCertInfo('***.example.myapp');
const hash = sha256(cert.certificate);
if (hash !== 'EXPECTED_HASH_HERE') {
throw new Error('签名不匹配!');
}
}
💡 建议将
EXPECTED_HASH_HERE分段存储或动态生成,避免硬编码。
五、网络通信安全加固
1. 强制 HTTPS + 证书绑定(Certificate Pinning)
在 resources/base/profile/***work_security_config.xml 中配置:
<***work-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">api.example.***</domain>
<pin-set expiration="2026-12-01">
<pin digest="SHA-256">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=</pin>
</pin-set>
</domain-config>
</***work-security-config>
并在 module.json5 引用:
{
"module": {
"***workSecurityConfig": "$profile:***work_security_config"
}
}
2. 敏感接口增加设备指纹
每次请求携带设备唯一标识(经 HUKS 加签):
final deviceId = await OHDevice.getSecureDeviceId(); // 原生生成并签名
final response = await http.post(url, headers: {'X-Device-ID': deviceId});
六、总结:安全不是功能,而是基线
在鸿蒙应用开发中,安全不应被视为附加功能,而应作为系统设计的基线要求。我们需要从以下五个维度构建立体防护体系:
1. 代码保护
- ArkTS混淆:使用官方提供的混淆工具对关键业务逻辑进行混淆处理,例如对支付模块、加密算法等核心代码进行名称混淆
- Dart关键逻辑下沉:将涉及敏感算法的Flutter模块通过FFI方式下沉到Native层实现,避免直接暴露在Dart代码中
2. 通信安全
- MethodChannel签名:为所有跨语言通信的MethodChannel添加数字签名验证,防止中间人攻击
- 敏感操作二次确认:对于支付、数据删除等高风险操作,必须增加生物识别或密码验证环节
3. 数据存储
- HUKS加密:利用鸿蒙统一密钥系统(HUKS)对本地存储的敏感数据进行加密,密钥由TEE安全环境保管
- 安全数据库:使用鸿蒙提供的安全数据库(SecurityDatabase)存储用户凭证等敏感信息,数据会自动加密且无法导出
4. 运行环境
- 调试检测:运行时检测是否处于调试模式,发现调试立即终止敏感操作
- 模拟器识别:通过检测设备特征识别模拟器环境,禁止在模拟器中运行核心功能
- 签名校验:验证应用签名是否匹配官方发布证书,防止二次打包攻击
5. 网络传输
- HTTPS强化:强制使用TLS 1.3协议,禁用不安全的加密套件
- 证书绑定:实现证书固定(Pinning)技术,防止中间人攻击
- 设备指纹:为每台设备生成唯一指纹,用于识别异常登录行为
| 防护维度 | 推荐措施 | 典型应用场景 |
|---|---|---|
| 代码保护 | ArkTS 混淆 + Dart 关键逻辑下沉 | 支付模块、版权保护功能 |
| 通信安全 | MethodChannel 签名 + 敏感操作二次确认 | 跨进程通信、金融交易 |
| 数据存储 | HUKS 加密 + 安全数据库 | 用户凭证、交易记录存储 |
| 运行环境 | 调试检测 + 模拟器识别 + 签名校验 | 反作弊系统、金融APP |
| 网络传输 | HTTPS + 证书绑定 + 设备指纹 | 用户登录、API通信 |
📌 重要提醒:
- 不要自行实现加密算法;
- 密钥绝不硬编码;
- 安全方案需定期更新(如证书轮换)。
通过上述措施,你的 OpenHarmony + Flutter 应用将具备抵御常见攻击的能力,满足等保与行业合规要求。