第94篇 | HarmonyOS 开源前安全清单:签名、Key、AGC 文件不能进仓库

Day20 是发布和开源前的收束。代码能跑起来不代表可以直接公开,尤其是 HarmonyOS 项目里常见的签名配置、AGC 参数、API Key、上传脚本和本地证书,一旦进仓库就可能带来真实风险。

这一篇把安全清单拆成三块:构建签名不要泄露、代码检查规则要开启、在线能力 Key 要有保存和清除路径。文章只讨论结构和边界,不暴露任何真实密钥值。

本篇目标

  • 检查签名配置、AGC 参数、API Key 是否进入可公开仓库。
  • 理解 code-linter 安全规则为什么属于发布质量的一部分。
  • 确认应用内 Key 有保存、清除和本地持久化边界。
  • 形成开源前脱敏清单,避免发布文章或仓库时带出私密文件。

对应源码位置

  • superImage/build-profile.json5
  • superImage/code-linter.json5
  • superImage/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。项目里提供 saveApiKeyclearApiKey,用户能在应用内保存,也能清掉本地 Key。这比把 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 时直接提示,避免静默上传或使用错误配置

开源前最后再做一次全文搜索:keysecretpasswordAGC_CLIENT_SECRET.p12.cer.p7bAuthorization。搜索命中不一定都是问题,但每一处都要能解释。

工程验收表

检查项 通过标准
签名文件 证书、密码、私有 profile 不进入公开仓库。
AGC 参数 client id、client secret、app id 使用环境变量或私有配置。
API Key 文章、截图、日志不展示真实 Key,应用内支持清除。
安全规则 code-linter 安全规则和构建结果一起留档。

真机复测口令

发布前先跑一次本地敏感词扫描,重点查 client_secretAGC_CLIENT_SECRETprivateKey.p12.cerapikeytoken。再打开 README、截图和脚本示例,确认它们只暴露变量名和用途,不暴露真实值。

安全文章的验收不只是“仓库里没有密钥”。还要确认应用内保存 Key 的路径可清除,日志不会打印完整密钥,截图不会拍到真实配置。只要其中一个环节暴露,开源材料就不能进入下一步。

今日练习

  1. 用全文搜索检查仓库里是否出现真实 AGC 或 ARK 凭据。
  2. 在应用内保存并清除一次 API Key,确认状态文案可见。
  3. 检查发布截图,遮掉所有可能暴露账号、包名密钥或访问令牌的内容。
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐