HarmonyOS 7 / API 26 HiLog 日志怎么防泄漏:手机号、token 和发布包调试日志怎么挡住
HarmonyOS 7 / API 26 HiLog 日志怎么防泄漏手机号、token 和发布包调试日志怎么挡住日志是开发时最顺手的排查工具但也是最容易被忽略的隐私风险。HarmonyOS 7.0.0 / API 26 项目里如果把手机号、token、完整接口参数直接打进 HiLog开发阶段看起来很方便到了发布包和上架审核前就会变成风险点。这篇只讲一个具体问题日志怎么写才能既能定位问题又不把敏感信息带出去。运行环境和检查范围项目取值系统版本HarmonyOS 7.0.0满足 HarmonyOS 5.0.0 及以上要求API 版本API 26工程模型Stage 模型语言与框架ArkTS ArkUI关注能力HiLog 日志、隐私合规、发布包检查、上架审核验证目标开发态可排查发布态不泄漏手机号、token 和完整请求参数这个主题适合上架前自查也适合团队代码提交前做静态检查。它不是为了把所有日志都删掉而是把日志分级、脱敏和发布态关闭这三件事做成固定规则。问题一般怎么发生坏例子通常长这样hilog.info(0x0000,Login,phonephone, tokentoken)这段代码的问题不是 HiLog 本身而是日志内容没经过处理。手机号、token、完整请求体这些字段一旦出现在日志里后面再靠人工检查就很难完全挡住。我会把风险拆成三类敏感字段没有脱敏所有环境都打同一套日志发布包里还保留 debug 级别日志。先用脚本把坏例子挡住下面这个脚本模拟三种日志策略裸日志、开发态脱敏日志、发布态日志。坏例子必须失败好例子必须通过。constcases[{name:bad-raw-log,usesLevelSwitch:false,masksPhone:false,masksToken:false,blocksReleaseDebug:false},{name:good-dev-log,usesLevelSwitch:true,masksPhone:true,masksToken:true,blocksReleaseDebug:false},{name:good-release-log,usesLevelSwitch:true,masksPhone:true,masksToken:true,blocksReleaseDebug:true},];functioninspect(item){consterrors[];if(!item.usesLevelSwitch)errors.push(missing log level switch);if(!item.masksPhone)errors.push(phone number is not masked);if(!item.masksToken)errors.push(token is not masked);if(item.name.includes(release)!item.blocksReleaseDebug)errors.push(debug log is still enabled in release build);return{...item,passed:errors.length0,errors};}constresultcases.map(inspect);console.log(JSON.stringify({total:result.length,passed:result.filter((item)item.passed).length,failed:result.filter((item)!item.passed).length,result,},null,2));本地结果是 3 个用例里 2 个通过、1 个失败。失败的是裸日志这正好说明检查能挡住最危险的写法。{total:3,passed:2,failed:1}第一层先做字段脱敏不要在每个调用点临时想要不要脱敏。更稳的方式是先封一个统一方法所有日志都从这里过。functionmaskPhone(value:string):string{returnvalue.replace(/(\d{3})\d{4}(\d{4})/,$1****$2)}functionmaskToken(value:string):string{if(!value||value.length10)return***returnvalue.slice(0,4)***value.slice(-4)}functionsanitizeLog(input:Recordstring,string):Recordstring,string{return{...input,phone:input.phone?maskPhone(input.phone):,token:input.token?maskToken(input.token):,}}这样调用侧不需要记住每个字段怎么处理只要先把日志参数交给 sanitizeLog。第二层日志要分环境开发包需要更多信息发布包需要更严格。我的习惯是把日志开关放在统一入口不让业务代码自己判断。typeLogLeveldebug|info|warn|errorconstisReleasetruefunctioncanPrint(level:LogLevel):boolean{if(isReleaseleveldebug)returnfalsereturntrue}functionsafeLog(level:LogLevel,tag:string,data:Recordstring,string){if(!canPrint(level))returnconstsafeDatasanitizeLog(data)hilog.info(0x0000,tag,JSON.stringify(safeData))}这里重点不是 isRelease 这个变量怎么来而是日志策略要集中管理。发布包不应该依赖每个开发者手动删 debug 日志。第三层上架前怎么查上架审核前我会至少查四件事搜索 hilog、console、JSON.stringify看有没有裸输出搜索 phone、token、password、authorization看有没有直接拼日志确认发布态 debug 日志被开关挡住对照隐私声明看日志里有没有声明之外的采集字段。这一步很实际。很多问题不是代码不会写而是发布前没人把日志当成隐私出口来查。两个用例怎么验第一个用例是登录失败。输入手机号和 token让日志输出失败原因。合格结果应该能看到错误码和接口名称但看不到完整手机号和完整 token。第二个用例是发布包检查。把环境切到 release再跑 debug 日志。合格结果应该是 debug 日志完全不输出warn 和 error 仍然可以输出必要的错误码。方案对比方案好处问题手动不打敏感字段改动少靠人记容易漏调用点各自脱敏比裸日志好规则分散后期难维护统一日志入口脱敏加环境开关最稳适合团队复用前期要补一个小封装我会选第三种。日志是基础设施越早统一后面越少返工。最后怎么避免再出问题我的做法是把日志检查放进提交前和发布前两道门提交前挡明显的敏感字段发布前再查 release 包日志策略。这样既不影响开发定位问题也能减少上架前临时大面积改代码的风险。HiLog 本身是工具真正决定安全的是我们往里面写什么。把脱敏、分级、发布态开关做成固定入口日志就能继续帮我们定位问题而不是变成新的审核风险。两个复现场景先把问题跑出来场景一登录失败时直接打印请求参数登录失败最容易偷懒开发时想知道手机号、验证码、token 到底有没有传过去于是把整段对象直接打出来interfaceLoginRequest{phone:stringverifyCode:stringtoken:string}functionbadLoginLog(req:LoginRequest){hilog.info(0x0000,Login,requestJSON.stringify(req))}这个写法排查问题很快但风险也很直接日志里会出现完整手机号、验证码和 token。只要日志被导出、截屏、上传到排障系统敏感信息就跟着出去了。我更倾向于把日志入口收住而不是要求每个调用处都记得脱敏constLOG_DOMAIN0x0001typeLogLeveldebug|info|warn|errorfunctionmaskPhone(phone:string):string{if(!phone||phone.length7)return***returnphone.slice(0,3)****phone.slice(-4)}functionmaskToken(token:string):string{if(!token)returnemptyreturntoken.slice(0,4)***token.slice(-4)}functionsafeLoginLog(level:LogLevel,req:LoginRequest,isRelease:boolean){if(isReleaseleveldebug)returnconstsafePayload{phone:maskPhone(req.phone),verifyCode:***,token:maskToken(req.token)}hilog.info(LOG_DOMAIN,Login,JSON.stringify(safePayload))}这里的关键不是多写几行工具函数而是把规则固定下来手机号只能保留首尾验证码永远不打印token 只能留很短的定位片段发布态直接关掉 debug 日志。场景二接口异常时把完整响应体打出来第二类问题更隐蔽。很多接口失败会把请求头、服务端返回、错误码一起打印代码看起来像这样functionbadApiErrorLog(url:string,headers:Recordstring,string,body:string){hilog.error(0x0000,Api,urlurl, headersJSON.stringify(headers), bodybody)}这个问题不只出现在登录页。支付、个人资料、设备绑定、消息推送这些链路只要 headers 里带 Authorization日志就可能把凭证带出去。更稳的做法是把“允许打印的字段”和“必须拦截的字段”分开constBLOCK_KEYS[authorization,token,cookie,set-cookie,phone,verifycode]functionsanitizeRecord(input:Recordstring,string):Recordstring,string{constoutput:Recordstring,string{}Object.keys(input).forEach((key){constlowerKeykey.toLowerCase()output[key]BLOCK_KEYS.includes(lowerKey)?***:input[key]})returnoutput}functionsafeApiErrorLog(url:string,headers:Recordstring,string,statusCode:number){hilog.error(LOG_DOMAIN,Api,JSON.stringify({url,statusCode,headers:sanitizeRecord(headers)}))}这段代码故意不打印完整 body。很多时候定位接口问题只需要 url、状态码、traceId、少量白名单字段完整 body 反而是最容易出事的部分。我会怎么选调用处自觉还是统一封装方案优点问题适合场景每次打印前手动脱敏改动小上手快很容易漏代码审查压力大临时排查不适合长期维护封装 safeLog 方法规则统一方便 CI 检查前期要梳理字段规则推荐适合团队项目发布包完全关闭日志风险最低线上问题定位会变弱金融、账号、安全要求很高的模块我会选第二种保留必要日志但所有入口都走 safeLog。这样开发态还能定位问题发布态也不会把敏感字段带出去。放进 CI 里的最低检查只靠人眼看日志代码不稳定。至少要在提交前挡住几个高风险写法constfsrequire(fs)constsourcefs.readFileSync(entry/src/main/ets/pages/LoginPage.ets,utf8)constblockedPatterns[/hilog.(debug|info|warn|error)([^]*(phone|token|authorization|cookie)/i,/JSON.stringify([^]*(request|headers|body)/i,/verifyCode/i]consthitblockedPatterns.find((pattern)pattern.test(source))if(hit){console.error(日志检查失败存在可能泄漏敏感字段的日志写法)process.exit(1)}console.log(日志检查通过)这个检查不需要一开始就做得很复杂。先挡住手机号、token、authorization、cookie、验证码再逐步把项目里的敏感字段补进去。上架前自查清单发布包里是否还有 debug 级别日志登录、支付、用户资料、设备绑定页面是否打印手机号、token、验证码网络错误日志是否打印完整 headers 和 body线上排障是否只保留 traceId、状态码、接口名和脱敏后的关键字段代码提交前是否有脚本拦截高风险日志团队是否约定所有日志统一走 safeLog不允许业务代码直接拼接敏感字段。这个问题越早处理越省事。等到上架前再全局搜索日志通常会发现一堆临时排查代码混在业务里很难判断哪条能删、哪条还要保留。把脱敏、分级、发布态关闭做成固定入口后面每个页面都能复用。

相关新闻

等离子表面处理设备采购全流程技术管控要点

等离子表面处理设备采购全流程技术管控要点

等离子表面处理设备的采购涉及多个环节,每个环节都有技术管控要点。本文从全流程角度梳理关键节点。一、选型阶段的技术要点技术要点具体内容处理均匀性偏差行业标准≤5,批量采购应≤3放电功率偏差行业标准≤3%,批量采购应≤1.5%安全性能急停…

2026/8/5 8:51:48 阅读更多 →
[开源项目]CreatorHub 本地运行的多平台内容管理面板,支持 抖音 / 小红书 / 快手 / 视频号

[开源项目]CreatorHub 本地运行的多平台内容管理面板,支持 抖音 / 小红书 / 快手 / 视频号

CreatorHub GitHub项目地址:https://github.com/3441293738/creatorhub 本地运行的多平台内容管理面板,支持 抖音 / 小红书 / 快手 / 视频号。 在线预览 在线预览由 GitHub Pages 提供,使用脱敏示例数据,仅展示界面与交互;登录、…

2026/8/5 8:51:48 阅读更多 →
全志FEL模式工具sunxi-tools编译与实战指南

全志FEL模式工具sunxi-tools编译与实战指南

1. 项目概述:为什么我们需要自己编译sunxi-tools? 如果你手头有一块全志芯片的开发板,比如经典的F1C100s、V3s,或者是性能更强的H616、H618,那么“FEL模式”这个词对你来说一定不陌生。FEL(Flash and Execu…

2026/8/5 8:51:48 阅读更多 →

最新新闻

算法日记 - Day8

算法日记 - Day8

两数相加 这是在计算两个数之和,因为是逆序,所以正好是从个位开始计算到十位到百位需要考虑进位,进位最大是 1如果 A 链表中某个位置是空的,类似于 B 链表中同一个位置的值 0 进位 使用指针,分别遍历两个链表同位置…

2026/8/5 17:13:53 阅读更多 →
收藏!985硕士刚毕业就拿到百度大模型岗30k*16 Offer,值不值?小白程序员必看!

收藏!985硕士刚毕业就拿到百度大模型岗30k*16 Offer,值不值?小白程序员必看!

一位985硕士毕业生获得百度大模型开发岗30k*16年薪,引发热议。文章分析,百度薪资虽有严格职级标准,但考虑到其AI领头羊地位、业务落地能力及职业稳定性,此offer对想在AI领域深耕的小白程序员来说,是值得收藏的扎实起点…

2026/8/5 17:13:53 阅读更多 →
小白程序员必备:从0到1掌握AI Agent后端开发(含学习路线+面试考点)

小白程序员必备:从0到1掌握AI Agent后端开发(含学习路线+面试考点)

本文通过拆解北京1-3年薪资20-40K的AI Agent后端JD,提炼出企业招聘的核心能力:1)企业级Agent架构研发(微服务、工作流编排);2)RAGAgent工程化落地(解决真实痛点如准确率、成本控制&a…

2026/8/5 17:13:53 阅读更多 →
为什么选择本地音频转录:3步完成Buzz安装的完整指南

为什么选择本地音频转录:3步完成Buzz安装的完整指南

为什么选择本地音频转录:3步完成Buzz安装的完整指南 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz 在数字时代&a…

2026/8/5 17:13:53 阅读更多 →
iOS模拟器控制自动化测试:从零基础配置到企业级部署全攻略

iOS模拟器控制自动化测试:从零基础配置到企业级部署全攻略

iOS模拟器控制自动化测试:从零基础配置到企业级部署全攻略 【免费下载链接】ios-simulator-mcp MCP server for interacting with the iOS simulator 项目地址: https://gitcode.com/gh_mirrors/io/ios-simulator-mcp iOS Simulator MCP Server是一款基于Mod…

2026/8/5 17:13:53 阅读更多 →
【路径规划】基于模拟退火算法求解单中心的车辆路径规划问题matlab代码

【路径规划】基于模拟退火算法求解单中心的车辆路径规划问题matlab代码

1 简介VRP问题在现实生活中应用广泛,很多领域的问题都可以抽象成VRP问题进行解决,其研究和应用一直是热点。 本文首先详细介绍了VRP问题的分类,常见的约束条件及基本的研究技术和方法。给出了几个基本VRP问题的介绍及其数学模型。 模拟退火算法(SA)相对于其它智能算法在求解VRP…

2026/8/5 17:12:52 阅读更多 →

日新闻

Java缓存框架:JetCache

Java缓存框架:JetCache

TOC 一、简介 JetCache 是一个 Java 缓存抽象框架,为不同的缓存解决方案提供了统一的使用方式。 它提供的注解比 Spring Cache 更加强大。 JetCache 的注解支持原生 TTL、两级缓存以及在分布式环境中的自动刷新功能,同时你也可以通过代码直接操作 Cach…

2026/8/5 0:00:43 阅读更多 →
AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

AD 铺铜设置十字连接,过孔全连接,新版AD的简单设置

需求:通孔焊盘 十字花;过孔 Via 实心直连;贴片焊盘按需设置 AD 测试版本AD24 很多工程师踩坑:全部统一十字,导致接地过孔阻抗高、大电流发热! 一、快捷键打开规则 PCB 界面按下:D R 展开…

2026/8/5 0:00:43 阅读更多 →
AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

AI素描转换技术深度拆解(2024最新论文+工业级落地代码):从Stable Diffusion ControlNet到LoRA微调全链路解析

更多请点击: https://kaifayun.com 第一章:AI生成素描效果 AI生成素描效果是计算机视觉与风格迁移技术融合的典型应用,其核心在于将彩色照片或RGB图像转换为具有手绘质感、明暗对比强烈、边缘清晰的单色素描图像。该过程通常依赖于深度学习模…

2026/8/5 0:00:43 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →