20、安全与隐私:权限模型、数据加密、安全通信、合规性要求

各位同学,今天我们来聊聊车机安全。说实话,在车载系统里谈安全,跟手机端还真不太一样。手机丢了你可以远程擦除,车机要是被攻破了,那可是关系到人身安全的大事。我在做某个车厂项目时,就亲眼见过测试车因为一个未授权的第三方应用读取了车辆CAN总线数据,导致仪表盘乱跳——嗯,那场面,至今难忘。

20.1 Android Automotive OS 的权限模型

Android Automotive 的权限模型,说白了就是「谁可以干什么」。它继承了AOSP的权限体系,但针对车载场景做了大量定制。

20.1.1 权限分级

我个人习惯把车机权限分成三个层级:

  • 普通权限:比如访问网络、读取媒体文件。安装时自动授予,用户无感。
  • 危险权限:比如读取位置、麦克风、摄像头。需要弹窗让用户确认。
  • 签名权限:比如访问车辆信号(车速、车门状态)。只有系统应用或同签名的应用才能获取。

关键点:在车机上,很多危险权限其实不需要用户弹窗。比如导航应用读取位置——你想想看,用户都坐在车里了,还能去哪?所以系统会默认授予「同用户场景」下的权限。

20.1.2 车辆专属权限

Android Automotive 新增了一组 vehicle 开头的权限,专门控制车辆硬件接口。举个例子:

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.car.permission.CAR_SPEED" />
<uses-permission android:name="android.car.permission.CAR_ENERGY" />
<uses-permission android:name="android.car.permission.CAR_INFO" />

这些权限默认只授予系统应用。第三方应用想获取车速?门都没有。我在项目中遇到过,有个第三方地图厂商非要读取车速来做超速提醒,最后只能通过系统级代理服务间接提供——嗯,安全边界不能破。

20.2 数据加密:存储与传输

数据加密分两块:一块是存着的时候(静态数据),一块是传的时候(传输数据)。

20.2.1 静态数据加密

Android Automotive 默认启用了 文件级加密(File-Based Encryption, FBE)。每个用户的数据用不同的密钥加密,密钥由 GateKeeper 服务管理。

我个人建议,敏感数据一定要用 Android Keystore 来存储密钥。为什么?因为Keystore的密钥跑在TEE(可信执行环境)里,就算系统被root了,密钥也拿不走。

// 使用 Keystore 生成 AES 密钥
KeyGenerator keyGen = KeyGenerator.getInstance(
    KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
keyGen.init(
    new KeyGenParameterSpec.Builder("my_car_key",
        KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
        .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
        .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
        .build());
SecretKey key = keyGen.generateKey();

避坑指南:我曾经把用户的车载支付密码直接存到SharedPreferences里,结果被安全审计打回来重做。记住:SharedPreferences是明文存储,永远不要放敏感信息。

20.2.2 传输数据加密

车机与云端通信,必须使用 TLS 1.2+。Android Automotive 默认启用了网络安全配置,禁止明文HTTP流量。

<!-- res/xml/network_security_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="false">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

你想想看,如果车机跟云端通信被中间人攻击,攻击者可以伪造OTA升级包,把恶意固件刷进车机——那后果就不只是隐私泄露了,是物理安全问题了。

20.3 安全通信:车内网络与外部连接

车机内部有多个ECU(电子控制单元),它们之间通过CAN、以太网、LIN等总线通信。Android Automotive 作为信息娱乐域的核心,必须保证这些通信的安全。

20.3.1 车内通信安全

Android Automotive 通过 CarService 来代理所有车辆信号访问。应用不能直接读写CAN总线,必须通过CarService的API。CarService内部做了权限校验和速率限制。

// 应用只能通过 CarService 获取车速
Car car = Car.createCar(context);
VehiclePropertyManager vpm = 
    (VehiclePropertyManager) car.getCarManager(VehiclePropertyManager.class);
int speed = vpm.getIntProperty(VehiclePropertyIds.PERF_VEHICLE_SPEED, 0);

注意:千万不要在应用层直接打开Socket连接CAN总线。我曾经见过一个开发者为了「性能优化」直接访问CAN设备节点,结果导致车辆在行驶中误触发了刹车信号——嗯,这个开发者后来被调去写文档了。

20.3.2 外部通信安全

车机与手机、智能钥匙、路侧单元(RSU)的通信,建议使用 BLE(低功耗蓝牙)NFC,并启用配对绑定和会话密钥协商。

Android Automotive 支持 Secure Element(安全元件),用于存储数字车钥匙的私钥。这个安全元件是独立的硬件芯片,跟主CPU隔离,就算系统被攻破,车钥匙也拿不走。

20.4 合规性要求

合规性这块,说白了就是「法律让你怎么做,你就得怎么做」。不同国家、不同地区的要求还不一样。

20.4.1 主要法规

法规/标准 适用地区 核心要求
GDPR 欧盟 用户数据收集需明确同意,支持数据删除
CCPA 美国加州 用户有权知道哪些数据被收集,有权拒绝出售
《个人信息保护法》 中国 最小必要原则,本地化存储,跨境传输需评估
ISO 21434 全球 道路车辆网络安全工程,覆盖全生命周期

20.4.2 合规实践

我在做中国区项目时,遇到过最头疼的问题就是「数据本地化」。法规要求车辆位置数据、驾驶行为数据必须存储在中国境内的服务器上。我们当时做了两套后端:一套在国内,一套在海外,通过车机的区域码自动切换。

核心原则
1. 只收集「最小必要」的数据——能不加就不加。
2. 数据加密存储,密钥与用户身份绑定。
3. 提供清晰的隐私政策,让用户知道数据去了哪里。
4. 支持用户一键删除所有个人数据(工厂重置)。

20.5 知识体系总览

下面这张图,是我自己整理的安全与隐私知识体系。你可以把它当成一张「检查清单」,做项目时对照着看,缺了哪块补哪块。

Android Automotive OS 安全与隐私知识体系 权限模型 普通权限 危险权限 签名权限 车辆专属权限 数据加密 文件级加密(FBE) Android Keystore TLS 1.2+ 网络安全配置 安全通信 CarService代理 CAN总线隔离 BLE配对绑定 Secure Element 合规性 GDPR / CCPA 个人信息保护法 ISO 21434 数据本地化 安全 核心原则 最小权限 · 默认加密 · 纵深防御 · 合规先行 权限控制谁可以访问 → 加密保护数据本身 → 安全通信保障传输 → 合规确保合法 四个环节缺一不可,任何一个短板都可能成为攻击入口

我的建议:做车机安全,不要想着「一步到位」。先搞定权限模型,再上加密,然后加固通信,最后过合规审计。一步一步来,稳扎稳打。我曾经见过一个团队,上来就搞硬件安全模块,结果基础权限都没配好,第三方应用直接读走了车辆VIN码——嗯,基础不牢,地动山摇。


公众号:蓝海资料掘金营,微信deep3321