第94篇 | HarmonyOS 开源前安全清单:签名、Key、AGC 文件不能进仓库
第94篇 | HarmonyOS 开源前安全清单:签名、Key、AGC 文件不能进仓库
Day20 是发布和开源前的收束。代码能跑起来不代表可以直接公开,尤其是 HarmonyOS 项目里常见的签名配置、AGC 参数、API Key、上传脚本和本地证书,一旦进仓库就可能带来真实风险。
这一篇把安全清单拆成三块:构建签名不要泄露、代码检查规则要开启、在线能力 Key 要有保存和清除路径。文章只讨论结构和边界,不暴露任何真实密钥值。
本篇目标
- 检查签名配置、AGC 参数、API Key 是否进入可公开仓库。
- 理解 code-linter 安全规则为什么属于发布质量的一部分。
- 确认应用内 Key 有保存、清除和本地持久化边界。
- 形成开源前脱敏清单,避免发布文章或仓库时带出私密文件。
对应源码位置
superImage/build-profile.json5superImage/code-linter.json5superImage/entry/src/main/ets/services/VolcengineArkService.ets
签名配置先做脱敏检查
HarmonyOS 工程的 build-profile.json5 会涉及 signingConfigs 和 product 构建配置。开源前不要只看源码目录,还要检查工程根目录、AppScope、entry 模块和脚本目录。
如果签名文件、证书密码或 AGC 私有参数被写死在仓库里,后续即使删掉也可能留在历史记录中。发布前更稳妥的做法是把敏感值放到本地环境变量或不入库配置里。

开源前安全检查要覆盖配置、代码、脚本和文章截图
{
"app": {
"signingConfigs": [
{
"name": "default",
"type": "HarmonyOS",
"material": {
"storeFile": "C:/Users/yutian/Desktop/证书/古今/leson.p12",
"storePassword": "0000001DFE45654B543C05226889D63902E5E29E7A55B65436208E9B89357C01AFC4F3137A76F45D00E26E6A22",
"keyAlias": "leson",
"keyPassword": "0000001D423C9C3FCFD65AEE220364185D52BCEA43E48FF34AF9120A413CBD7A40F6B14174021C5D17C55BBF90",
"signAlg": "SHA256withECDSA",
"profile": "C:/Users/yutian/Desktop/证书/古今/新相机发布证书Release.p7b",
"certpath": "C:/Users/yutian/Desktop/证书/古今/发布证书.cer"
}
},
{
"name": "fabu",
"type": "HarmonyOS",
"material": {
"certpath": "C:/Users/yutian/Desktop/证书/古今/发布证书.cer",
"keyAlias": "leson",
"keyPassword": "0000001D5D0AB51E1BE72B550E36BCA9367E5544140E24B58B2BF8D36C795F70508BEA50DF97425D742B6DDF16",
"profile": "C:/Users/yutian/Desktop/证书/古今/新相机发布证书Release.p7b",
"signAlg": "SHA256withECDSA",
"storeFile": "C:/Users/yutian/Desktop/证书/古今/leson.p12",
"storePassword": "0000001D17FA7664B354891B79FB39B7E5639B898E98A6AD484BB18B9A68EC9DD1532D7C448FC57F218566C9E2"
}
}
],
"products": [
{
"name": "default",
"signingConfig": "default",
代码检查规则也属于安全交付
code-linter.json5 里开启了多条安全规则,包括不安全 AES、hash、RSA、DSA、ECDSA 等检查。它们不是为了“过形式”,而是防止后续功能迭代时把弱算法带进发布版本。
开源前建议把 lint 结果和构建结果一起记录,避免仓库看起来很完整,但实际安全规则长期没有跑过。

安全规则要进入发布流程,而不是只在问题发生后手工检查
"plugin:@performance/recommended",
"plugin:@typescript-eslint/recommended"
],
"rules": {
"@security/no-unsafe-aes": "error",
"@security/no-unsafe-hash": "error",
"@security/no-unsafe-mac": "warn",
"@security/no-unsafe-dh": "error",
"@security/no-unsafe-dsa": "error",
"@security/no-unsafe-ecdsa": "error",
"@security/no-unsafe-rsa-encrypt": "error",
"@security/no-unsafe-rsa-sign": "error",
"@security/no-unsafe-rsa-key": "error",
"@security/no-unsafe-dsa-key": "error",
"@security/no-unsafe-dh-key": "error",
"@security/no-unsafe-3des": "error"
}
应用内 Key 要能保存也能清除
在线 ARK 能力需要 API Key。项目里提供 saveApiKey 和 clearApiKey,用户能在应用内保存,也能清掉本地 Key。这比把 Key 写死在源码里更符合隐私和开源边界。
文章、截图、日志里都不要出现真实 Key。需要讲代码时,只展示保存和清除逻辑,不展示具体密钥字符串。

在线能力 Key 需要用户可控的保存和清除路径
static async saveApiKey(context: common.UIAbilityContext, apiKey: string): Promise<void> {
const storedConfig = await VolcengineArkService.loadStoredConfig(context);
const currentConfig = VolcengineArkService.normalizeConfig(storedConfig);
storedConfig.apiKey = apiKey.trim();
storedConfig.responseModel = currentConfig.responseModel;
storedConfig.videoModel = currentConfig.videoModel;
await VolcengineArkService.saveStoredConfig(context, storedConfig);
}
static async clearApiKey(context: common.UIAbilityContext): Promise<void> {
const storedConfig = await VolcengineArkService.loadStoredConfig(context);
const currentConfig = VolcengineArkService.normalizeConfig(storedConfig);
storedConfig.apiKey = '';
storedConfig.responseModel = currentConfig.responseModel;
storedConfig.videoModel = currentConfig.videoModel;
await VolcengineArkService.saveStoredConfig(context, storedConfig);
配置解析不能绕过用户边界
resolveConfig 会读取本地配置并检查 Key 是否存在。发布前要确认:没有 Key 时页面给出明确提示;清除 Key 后不会继续调用在线能力;导出的 README 说明里也要写清楚照片何时会发送到在线服务。
这类安全说明不是给审核看的空话,而是帮助用户理解本地能力和在线能力的边界。

缺少 Key 时直接提示,避免静默上传或使用错误配置
开源前最后再做一次全文搜索:key、secret、password、AGC_CLIENT_SECRET、.p12、.cer、.p7b、Authorization。搜索命中不一定都是问题,但每一处都要能解释。
工程验收表
| 检查项 | 通过标准 |
|---|---|
| 签名文件 | 证书、密码、私有 profile 不进入公开仓库。 |
| AGC 参数 | client id、client secret、app id 使用环境变量或私有配置。 |
| API Key | 文章、截图、日志不展示真实 Key,应用内支持清除。 |
| 安全规则 | code-linter 安全规则和构建结果一起留档。 |
真机复测口令
发布前先跑一次本地敏感词扫描,重点查 client_secret、AGC_CLIENT_SECRET、privateKey、.p12、.cer、apikey、token。再打开 README、截图和脚本示例,确认它们只暴露变量名和用途,不暴露真实值。
安全文章的验收不只是“仓库里没有密钥”。还要确认应用内保存 Key 的路径可清除,日志不会打印完整密钥,截图不会拍到真实配置。只要其中一个环节暴露,开源材料就不能进入下一步。
今日练习
- 用全文搜索检查仓库里是否出现真实 AGC 或 ARK 凭据。
- 在应用内保存并清除一次 API Key,确认状态文案可见。
- 检查发布截图,遮掉所有可能暴露账号、包名密钥或访问令牌的内容。
更多推荐



所有评论(0)