本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
鸿蒙(HarmonyOS)开发中,代码混淆加固是保护应用安全的核心技术之一,主要通过符号重命名、控制流混淆和数据加密等手段增加反编译难度。
一、混淆加固的核心概念
- 目的
- 防止逆向工程,保护核心算法和业务逻辑 。
- 缩短变量名和类名,减小应用体积 。
- 支持范围
- 文件类型:ArkTS、TS、JS、C/C++(动态库) 。
- 工程模型:仅Stage模型,且需在Release模式下生效 。
二、开启混淆的步骤与配置
1. 基础配置(build-profile.json5
)
在模块的配置文件中开启混淆,并指定规则文件路径:
{
"arkOptions": {
"obfuscation": {
"ruleOptions": {
"enable": true, // 必须为true
"files": ["./obfuscation-rules.txt"] // 规则文件路径
}
}
}
}
注意:HAR模块需额外配置consumerFiles
,用于依赖该库时的混淆规则合并。
2. 规则文件(obfuscation-rules.txt
)
常用配置选项:
# 开启属性名混淆(类成员变量)
-enable-property-obfuscation
# 开启全局作用域名混淆(如函数名)
-enable-toplevel-obfuscation
# 保留关键文件(如入口Ability)
-keep-file-name EntryAbility.ets
-keep-file-name index.ets
# 保留系统API(避免运行时错误)
-keep-import @ohos.net.http
三、常用混淆API与方法
1. 保留特定代码(白名单)
- 保留类名:防止核心类被混淆。
-keep-class com.example.SecurityUtils
- 保留方法:如加密算法。
-keep-method encryptData
2. 动态混淆(运行时保护)
通过@State
和@Link
绑定敏感数据,结合混淆后的方法名增强安全性:
@Reusable
@Component
struct SecureComponent {
@State private key: string = "confidential";
// 混淆后方法名变为随机字符串(如a1b2)
private decryptData(data: string): string {
return data.split('').reverse().join(''); // 示例逻辑
}
}
3. 资源混淆
在resources/base/element
中混淆资源ID:
{
"name": "string_encrypted",
"value": "0x7f0a001" // 混淆后的资源ID
}
四、混淆效果验证与调试
- 查看混淆结果
- 混淆后的文件位于
build/[module]/release/
目录下,如EntryAbility.js
变为a1.js
。
- 混淆后的文件位于
- 反编译验证 使用工具(如HDAnalyzer)检查混淆后的HAP包,确认敏感逻辑是否隐藏 。
- 调试还原 通过
hstack
插件还原混淆后的崩溃堆栈。
hstack -m nameCache.json -s sourceMaps.map crash.log
五、高级场景与避坑指南
1. 多模块合并规则
主模块的obfuscation-rules.txt
会与依赖HAR的consumer-rules.txt
合并,冲突时以主模块为准。
2. 常见问题
- 混淆后崩溃:检查是否误混淆系统API(如
@ohos
开头的模块) 。 - 无效混淆:确认编译模式为
release
,且enable
设为true
。
3. 性能权衡
- 推荐:仅混淆业务代码,避免混淆UI组件(如
@Component
结构体) 。 - 不推荐:对高频调用的方法启用控制流混淆,可能降低运行速度 。
六、完整示例:电商应用混淆配置
1. 规则文件
# 混淆属性与方法名
-enable-property-obfuscation
-enable-toplevel-obfuscation
# 保留支付模块
-keep-class com.example.PaymentService
-keep-method processPayment
# 保留页面入口
-keep-file-name MainPage.ets
-keep-file-name EntryAbility.ets
2. 关键代码保护
// 混淆前
class PaymentService {
private apiKey = "123-456";
encryptCard(card: string): string { /* ... */ }
}
// 混淆后(通过反编译验证)
class a {
private b = "123-456";
c(d: string): string { /* ... */ }
}
七、推荐工具
- ArkGuard:鸿蒙自研混淆工具,支持ArkTS/JS 。
- 爱加密插件:一键加固C/C++动态库 。
通过合理配置混淆规则,可显著提升应用安全性。更多细节参考:ArkGuard官方文档