链路到端上:HTTPS 之后安全题还在考什么

这一篇最容易出现一个误区:很多人背得出 HTTP/HTTPSSP/MMKV、签名和混淆,但一到项目里就讲不清"为什么要这样设计"。高级岗位面试更看重你对边界和风险的理解。

1. HTTPHTTPS 的区别,面试怎么答更完整?

参考答案

HTTP 是明文传输协议,HTTPS 是在 HTTP 之上增加 TLS 安全层,目标是保证传输过程中的机密性、完整性和身份校验。

面试时别只停在"HTTPS 更安全"。更完整的回答是:

  • 它通过证书校验服务端身份
  • 通过密钥协商建立安全会话
  • 通过加密和摘要校验降低中间人篡改风险

同时要补一句:HTTPS 只能保护传输链路,不代表客户端本地存储、逆向、内存抓取这些问题自动消失。

面试官继续追问什么

  • TLS 握手大致发生了什么?
  • 证书校验失败通常说明什么问题?
  • 为什么上了 HTTPS 仍然可能被抓包?

追问怎么答

  • TLS 握手核心是协商加密套件、校验证书、交换密钥,最后建立一个双方都认可的安全会话。
  • 证书校验失败常见是证书过期、域名不匹配、证书链不完整,或者客户端做了更严格的证书绑定。
  • 因为 HTTPS 保护的是传输链路,不代表客户端设备可信;安装根证书、代理调试或客户端本地被攻破后,仍可能被观察到流量。

2. OkHttp 为什么常被追问?它的价值是什么?

参考答案

OkHttp 不只是一个"发请求的库",它把连接复用、拦截器链、超时控制、缓存、重试和调度统一封装起来,让网络层更容易治理。

面试时可以这样讲它的价值:

  • 拦截器链便于统一鉴权、日志、重试、埋点
  • 连接池减少重复建连成本
  • 调度器统一管理并发请求
  • Retrofit 结合后,接口定义和执行逻辑分离更清晰

面试官继续追问什么

  • 应用拦截器和网络拦截器的区别?
  • 为什么请求失败不一定应该自动重试?
  • 连接复用对移动端有什么实际意义?

追问怎么答

  • 应用拦截器更偏业务层,适合统一加头、日志、鉴权;网络拦截器更接近真实网络过程,能看到重定向和缓存等细节。
  • 自动重试不当会放大服务端压力、制造重复写入,尤其对非幂等请求风险很大。
  • 连接复用能减少频繁握手和建连成本,对高延迟、弱网和电量敏感的移动端收益很实际。

3. 弱网优化应该怎么讲?

参考答案

弱网优化不是简单地"加重试"。更合理的思路是:

  • 先区分失败类型,是超时、断网、服务端错误还是 DNS 问题
  • 对幂等请求才考虑自动重试
  • 避免多个重复请求同时打到同一资源
  • 对关键页面优先保证核心内容,非核心资源延后
  • 用缓存、降级和骨架屏提升体感

高级岗位更看重你是否理解"稳定性"和"用户感知"都属于网络设计的一部分。

4. 本地存储怎么选,SharedPreferencesMMKV、数据库分别适合什么?

参考答案

  • SharedPreferences 适合小型键值配置,使用简单,但在频繁写入或数据量增大时不够理想。
  • MMKV 本质上更适合高性能键值存储场景,读写效率通常更高。
  • 数据库适合结构化数据、查询条件复杂、需要事务或迁移控制的场景。

高级回答要补一句:存储选型不只是看"快不快",还要看数据模型、访问频率、一致性要求、可迁移性和排障成本。

面试官继续追问什么

  • apply()commit() 的区别是什么?
  • 为什么不是所有配置都该放数据库?
  • 配置数据越来越多时,如何做迁移和兼容?

追问怎么答

  • apply() 更偏异步提交,不阻塞当前线程;commit() 会同步落盘并返回结果,可靠但更可能卡主线程。
  • 数据库不是万能配置桶,小而简单的键值配置放数据库会增加建模、迁移和维护成本。
  • 配置越来越多时要做版本管理、默认值兼容和迁移策略,不要指望"旧字段永远不变"。

5. 离线缓存怎么设计,才能既提速又不把一致性搞乱?

参考答案

离线缓存设计通常要先回答三个问题:

  1. 缓存的目标是什么,是提速、离线可用,还是减轻服务端压力?
  2. 数据是强一致、最终一致,还是可接受短暂过期?
  3. 失败后用户要看到什么,是旧数据、空态,还是显式错误?

一个成熟的设计通常会包含:

  • 缓存时效策略
  • 拉取与写回时机
  • 版本和失效机制
  • 本地与远端冲突处理

面试官继续追问什么

  • 先读本地还是先拉远端?
  • 如何防止脏数据长时间停留?
  • 用户本地修改和服务端新数据冲突时怎么办?

追问怎么答

  • 先读本地还是先拉远端,要看目标是首屏速度还是强一致;很多场景会先展示本地,再异步刷新远端。
  • 防止脏数据长留,关键是时效策略、版本控制和明确失效条件,而不是"缓存了就算完"。
  • 冲突处理要按业务决定是客户端优先、服务端优先,还是做合并;核心是先定义规则,不能靠临场猜。

6. Android 安全里,签名、混淆、加固分别解决什么问题?

参考答案

  • 签名用来证明安装包来源和完整性,是应用身份的基础。
  • 混淆主要提高逆向阅读成本,同时可配合代码收缩减少包体积。
  • 加固通常是进一步提高静态分析和动态篡改成本。

但高级岗位要知道:这些都不是绝对安全方案。移动端安全的核心从来不是"完全防住",而是提高攻击成本、降低敏感面、控制风险暴露。

7. 本地敏感信息为什么不能明文存储?

参考答案

因为客户端设备不可信。只要数据落到本地文件、数据库、日志甚至内存,就有被调试、导出、逆向或截获的可能。明文存储会显著放大风险,尤其是令牌、手机号、身份证号、支付相关标识等敏感信息。

正确的思路通常是:

  • 能不存就不存
  • 必须存时尽量缩短生命周期
  • 结合系统安全能力和业务风险做最小化保存

面试官继续追问什么

  • 加密存储是不是就绝对安全了?
  • 为什么日志也可能成为安全漏洞?
  • 风险最低的令牌设计是什么样?

追问怎么答

  • 加密存储只能提高攻击成本,做不到绝对安全,因为密钥管理、运行时内存和设备环境本身都可能被攻击。
  • 日志常会把请求头、用户标识、错误上下文一起打出去,一旦收集或上报不当,就会把敏感信息暴露给不该看到的人。
  • 风险最低的令牌设计通常是短生命周期、最小权限、可撤销,并尽量避免长期明文持久化。

8. WebView 有哪些常见安全风险?

参考答案

WebView 风险常见在这些方面:

  • JavaScript 接口暴露不当
  • 加载不可信内容
  • 文件访问权限配置过宽
  • 重定向与 URL 校验不严
  • 混合内容和证书校验策略过松

如果项目里有 H5 混合页面,高级岗位通常会追问你是否做过 URL 白名单、桥接能力收敛和登录态隔离。

9. 为什么说移动端安全是"系统工程",不是一个 SDK 的事?

参考答案

因为风险链路是贯通的:接口设计、本地存储、日志打印、权限暴露、WebView 桥接、签名校验、灰度发布、风控策略都会互相影响。

真正成熟的安全策略通常不是"多上一层壳",而是:

  • 服务端不轻信客户端
  • 客户端只保留必要能力
  • 敏感链路最小暴露
  • 异常行为可监控、可止损

这类回答会明显比只背术语更有高级感。

相关推荐

《Android OkHttp+Retrofit+Rxjava+Hilt实现网络请求框架》

《Android 高级工程师面试参考答案:架构设计、Jetpack 与 Compose》

《Android 高级工程师面试参考答案:性能优化》

相关推荐
游戏开发爱好者82 小时前
深入理解iOSTime Profiler:提升iOS应用性能的关键工具
android·ios·小程序·https·uni-app·iphone·webview
帅次3 小时前
Android 高级工程师面试参考答案:架构设计、Jetpack 与 Compose
android·面试·职场和发展·架构·composer·jetpack
limingade3 小时前
Dialer3.0智能拨号器Android版功能说明书
android·蓝牙电话·手机转sip·手机蓝牙·智能拨号器
JJay.3 小时前
Android BLE 的 notify 和 indicate 到底有什么区别
android
橙子199110163 小时前
Android 异步任务和消息机制
android
被开发耽误的大厨3 小时前
5、Integer缓存池里同一个对象指的是什么?Integer 和String 内存结构逻辑完全一样?
android·java·哈希算法
NoSi EFUL11 小时前
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
android·数据库·mysql
安小牛14 小时前
Android 开发汉字转带声调的拼音
android·java·学习·android studio
聚美智数14 小时前
企业实际控制人查询-公司实控人查询
android·java·javascript