19、安全与隐私:Android Automotive 安全模型、数据加密与存储、隐私权限管理

车载系统安全,说实话,跟手机安全完全是两码事。

手机丢了,最多损失点个人数据。车机被攻破了,那可是要命的事。我在做第一代量产项目时,就深刻体会到了这一点——安全不是功能,是底线。

这一章,我们聊聊Android Automotive的安全模型、数据怎么加密、权限怎么管。嗯,都是硬骨头,但必须啃下来。

19.1 Android Automotive 安全模型

Android Automotive的安全模型,说白了就是「隔离+授权」。隔离是让各模块互不干扰,授权是让该访问的才能访问。

19.1.1 系统架构安全分层

我习惯把安全模型分成三层来看:

  • 硬件层:TrustZone、SE(安全元件)、HSM(硬件安全模块)
  • 内核层:SELinux、dm-verity、文件系统加密
  • 应用层:权限模型、Sandbox、签名验证

这三层缺一不可。我曾经在项目里只关注了应用层权限,结果内核层SELinux策略没配好,导致一个第三方应用能读到系统日志——嗯,那段时间加班改策略,记忆犹新。

19.1.2 SELinux 策略要点

Android Automotive里,SELinux是强制访问控制的核心。车机里多了很多汽车特有的服务,比如Vehicle HAL、CarService,这些都得单独配策略。

关键原则:最小权限原则。只给服务必要的权限,多一个都不要。

举个例子,Vehicle HAL需要访问CAN总线,但不需要访问网络。那策略里就要明确:

# 允许Vehicle HAL访问CAN设备
allow vehicle_hal vehicle_can_device:chr_file rw_file_perms;

# 明确禁止访问网络
neverallow vehicle_hal network_device:chr_file *;

我见过一个项目,直接把车载服务放进了system_app域,结果权限大得吓人。后来花了三周才把策略拆干净。所以,一开始就按最小权限来,能省很多事。

19.1.3 安全启动链

安全启动链,就是确保从BootROM到内核再到系统,每一级都经过签名验证。Android Automotive要求必须启用Verified Boot。

这里有个坑:车机的OTA升级频率低,但一旦升级失败,车就变砖了。所以,我建议在安全启动链里加入「回滚保护」机制——新版本签名后,旧版本就不能再启动了。这样能防止攻击者刷回有漏洞的老版本。

注意:回滚保护要谨慎配置。如果新版本有bug,用户想降级都不行。所以,OTA前一定要充分测试。

19.2 数据加密与存储

车机里存的数据,比手机敏感得多。导航历史、驾驶行为、甚至家里的车库门密码——这些一旦泄露,后果很严重。

19.2.1 文件级加密 vs 全盘加密

Android Automotive 10之后,默认使用文件级加密(FBE)。全盘加密(FDE)已经过时了。

加密方式 特点 适用场景
全盘加密(FDE) 整个分区一起加密,启动时需密码 早期Android版本
文件级加密(FBE) 每个文件单独加密,不同用户不同密钥 Android 10+,多用户场景

为什么FBE更适合车机?因为车机有多个用户:驾驶员、乘客、访客。FBE能让每个用户的数据隔离加密。我做过一个项目,需要支持「代客泊车模式」——代驾司机只能用车机导航,看不到车主的历史记录。用FBE,给代驾模式单独一个加密密钥,完美解决。

19.2.2 密钥管理

加密的密钥放哪?这是个核心问题。

Android Automotive使用Keymaster HAL来管理密钥。密钥存储在TrustZone或独立的安全芯片里,应用层拿不到明文密钥。

我建议:

  • 用户密钥:用锁屏密码派生,存在TEE里
  • 设备密钥:在工厂预置,用于OTA签名验证
  • 临时密钥:用于会话加密,用完即销毁

小技巧:如果车机没有独立安全芯片,可以用Android的StrongBox KeyStore。它利用TEE提供硬件级密钥保护,性能稍差,但安全等级够用。

19.2.3 数据存储最佳实践

我总结了几条经验:

  1. 敏感数据必须加密存储:比如用户密码、Token、驾驶行为数据。用EncryptedSharedPreferences或Jetpack Security库。
  2. 日志里不要打印敏感信息:我见过有人把用户密码直接log出来,这简直是给攻击者送人头。
  3. 临时文件用完即删:车机内存有限,临时文件不及时清理,既占空间又留隐患。
  4. 使用Android Keystore:不要自己写加密算法,用系统提供的Keystore,它底层调用了硬件安全模块。
// 使用EncryptedSharedPreferences存储敏感数据
MasterKey masterKey = new MasterKey.Builder(context)
    .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
    .build();

SharedPreferences sharedPreferences = EncryptedSharedPreferences.create(
    context,
    "secure_prefs",
    masterKey,
    EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
    EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);

sharedPreferences.edit().putString("user_token", token).apply();

19.3 隐私权限管理

隐私权限,是Android Automotive里最敏感的话题。车机上的传感器比手机多得多:GPS、摄像头、麦克风、车速传感器、方向盘角度传感器……这些数据一旦被滥用,用户毫无隐私可言。

19.3.1 权限模型的变化

Android Automotive的权限模型,跟手机版Android基本一致,但多了几个汽车特有的权限:

  • android.car.permission.CAR_SPEED:读取车速
  • android.car.permission.CAR_MILEAGE:读取里程
  • android.car.permission.CAR_INFO:读取车辆信息(VIN等)

这些权限默认只授予系统应用。第三方应用想用?得用户明确授权。

19.3.2 运行时权限申请

车机上的权限申请,跟手机有个很大的不同:用户可能正在开车。

你想想看,如果导航App突然弹出一个权限对话框,用户正在高速上,手一抖点错了怎么办?

所以,我建议:

  • 权限申请时机要合理:不要在驾驶过程中弹窗。可以在停车时,或者App首次启动时申请。
  • 使用HMI规范:车机的UI交互有严格规范,权限对话框要符合车载HMI设计,字体大、按钮大、操作简单。
  • 提供「仅本次允许」选项:有些权限(比如麦克风),用户可能只想在打电话时用一次。给这个选项,能提升用户信任感。

核心原则:车机上的权限管理,安全第一,用户体验第二。不要为了用户体验而牺牲安全。

19.3.3 隐私仪表盘

Android 12之后,系统提供了隐私仪表盘(Privacy Dashboard)。用户可以一目了然地看到:哪些App在什么时间访问了哪些敏感权限。

在车机上,这个功能尤其重要。因为车机可能同时运行多个App,用户需要知道:导航App是不是在偷偷录音?音乐App是不是在读取位置?

我建议在车机设置里,把隐私仪表盘放在显眼位置。最好再加一个「一键关闭所有敏感权限」的开关——嗯,这个功能我曾在项目里强烈要求加上,用户反馈非常好。

19.3.4 汽车特有的隐私场景

有几个场景,是手机没有的,但车机必须处理:

  1. 代客模式:代驾司机用车时,车主的数据必须完全隔离。代驾模式结束后,所有临时数据要彻底清除。
  2. 租车场景:租车用户的数据,在还车后必须全部删除。包括导航历史、蓝牙配对记录、登录账号等。
  3. 紧急呼叫(eCall):这个功能可以突破权限限制,在紧急情况下自动发送车辆位置。但要注意,eCall的数据只能用于救援,不能用于其他目的。

法律合规提醒:不同国家对车载数据隐私有不同法规。比如欧盟的GDPR、中国的《个人信息保护法》。做车机隐私功能时,一定要咨询法务团队。

19.4 安全与隐私的架构图

下面这张图,是我梳理的Android Automotive安全与隐私整体架构。从硬件到应用,每一层都有对应的安全机制。

Android Automotive 安全与隐私架构 应用层 权限模型 | 应用沙箱 | 签名验证 | 隐私仪表盘 框架层 CarService | 权限管理服务 | 加密服务 | Keymaster HAL 内核层 SELinux策略 | dm-verity | 文件系统加密(FBE) | 安全启动 硬件层 TrustZone | 安全芯片(SE/HSM) | 硬件密钥存储 安全机制 隐私保护

这张图里,每一层都环环相扣。硬件层提供信任根,内核层做强制访问控制,框架层管理权限和加密,应用层负责用户体验。少了任何一层,安全模型都不完整。

19.5 总结

安全与隐私,是车载系统的生命线。Android Automotive提供了从硬件到应用的完整安全模型,但工具再好,也得会用。

我个人习惯,做安全设计时遵循三个原则:

  • 最小权限:能不给的权限,坚决不给
  • 纵深防御:多层防护,单点失效不影响整体
  • 默认安全:出厂配置就是最安全的,用户不需要额外设置

记住,安全不是做完功能后加的补丁,而是从架构设计第一天就要考虑的事。希望这一章的内容,能帮你少踩一些坑。

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