尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Open Headunit无线凭据安全分析:为何每次会话都要重新协商PSK

Open Headunit无线凭据安全分析:为何每次会话都要重新协商PSK Open Headunit无线凭据安全分析为何每次会话都要重新协商PSK【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunitOpen Headunit 是一款开源的 Android Auto 无线投屏头单元应用运行在车机或平板上通过 Wi-Fi 热点 蓝牙 AAP 协议把手机上的导航、音乐实时投射到车机屏幕。本文从新手视角分析它的无线凭据PSK安全设计为什么每次连接会话都要重新协商 Wi-Fi 预共享密钥而不是缓存一份一劳永逸。什么是PSK为什么它值得专门分析PSKPre-Shared Key预共享密钥就是 Wi-Fi 密码。Open Headunit 的工作方式是车机先开一个WPA2-PSK 热点手机通过蓝牙RFCOMM 通道与车机建立 WPPWiFi Projection Protocol握手由车机把热点的 SSID 和密码亲手递给手机手机再连入热点最后 AAP 流量在热点之上建立。热点以 WPA2-PSK 模式配置// 1 SECURITY_TYPE_WPA2_PSK builderClass.getMethod(setPassphrase, String::class.java, Int::class.javaPrimitiveType) .invoke(builder, password, 1) 源码SoftApConfigCompat.kt关键点在于这个密码不是写死在应用里的而是每次连接前从车机系统实时读取 读取实现HotspotConfigReader.kt —— 通过反射调用getSoftApConfiguration()/getWifiApConfiguration()拿到(ssid, passphrase)读不到就返回null。每次会话重新协商的三步握手流程无线 AA 的凭据协商是一个严格的状态机核心实现在 WppHandshakeSession.kt消息结构定义在 wireless.proto。标准流程如下车机 → 手机WifiVersionRequest宣告协议版本 4.2车机 → 手机WifiStartRequest告诉手机连入后到哪个 IP/端口开会话手机 → 车机WifiInfoRequest把网络凭据给我车机 → 手机WifiInfoResponse凭据本体SSID key BSSID 安全模式手机 → 车机WifiStartResponse确认 WifiConnectStatus上报是否成功入网凭据消息本身的设计很克制message WifiInfoResponse { required string ssid 1; required string key 2; // 即 PSK optional string bssid 3; optional SecurityMode security_mode 4; optional AccessPointType access_point_type 5; } 定义wireless.proto为什么不缓存PSK而每次会话都重新拿1️⃣ 凭据是活的缓存就会过期车机的热点 SSID/密码可能随时变化用户修改、系统重置、厂商 ROM 行为。SoftApConfigCompat.kt 中的注释说得直白凭据已经发过一次给手机如果应用擅自改写 SSID 或密码等于在用户背后把别人的热点改名。所以项目坚持每次会话都从系统读回当前值而不是信任一份旧拷贝。2️⃣ 凭据只在已验证的会话上下文里传递注意第 3、4 步的时机车机不会在蓝牙还没握好手时把密码发出去。状态机 WppHandshakeSession.kt 里AWAIT_CREDENTIALS阶段会先锁存手机的请求pendingInfoRequest等凭据真正就绪才连发StartRequest InfoResponse。密码只在这部手机明确发起了投影请求的上下文里通过蓝牙信道交付配合上层 TLS 加密见下节大幅缩小了凭据暴露的窗口。3️⃣ 传输失败可以原样重发但不会重发旧凭据手机入网期间SETTLING阶段如果它再次请求凭据车机会重发同一份当前凭据——这是参考 aa-proxy-rs 的行为onSettling 逻辑。但同一份指的是本会话刚读回的那份而不是跨会话的缓存。4️⃣ 上层还有 TLS 会话密钥兜底Wi-Fi 密码只是进门钥匙真正的 AAP 数据流导航画面、音频、触摸全部跑在TLS之上。AapSslContext.kt 使用 Conscrypt 提供 TLS 引擎每次完整握手都会重新协商会话密钥密钥交换由 SSLEngine 完成握手超过 15 秒直接判定失败防止挂死保留默认会话缓存容量 10、24 小时同一应用会话内重连可走缩短握手兼顾性能与安全接口层 AapSsl.kt 提供performHandshake/postHandshakeReset/release生命周期会话结束即重置缓冲不残留上一会话的加密状态。也就是说PSK 管能不能连上热点TLS 会话密钥管数据通不通两层都按会话刷新任何一层泄露都不至于污染其他会话。这套设计对普通用户意味着什么特性用户视角凭据实时读取车机换了 Wi-Fi 密码后下次连接自动生效无需手动同步凭据按需交付陌生人扫到你的蓝牙拿不到密码——必须先走完整握手失败可诊断WifiConnectStatus带error_message_hint字段日志 里能看到手机为什么没连上隐私零收集官方 隐私政策 声明不收集、不存储、不上传任何个人数据无统计 SDK、无广告小结安全不是靠锁死的密码而是靠每次重新协商Open Headunit 的无线凭据安全可以概括为一句话宁可每次会话多花几秒重新协商也不让一份可能过期的 PSK 在系统里躺太久。Wi-Fi 层SSID/PSK 每次从系统实时读回仅在验证过的手握会话中交付手机WppHandshakeSession.kt传输层AAP 数据全量走 TLS会话密钥按连接协商超时即断AapSslContext.kt数据层所有内容留在手机上车机只做显示与输入中转PRIVACY.md。对于新手来说理解这套机制只需记住三个关键词实时读取不缓存、按需交付不广播、会话密钥不残留。这也是开源车载投屏方案中少见的、把凭据生命周期当成一等公民来处理的设计。【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表