简介:《信息安全技术 网联汽车 采集数据的安全要求》是由全国信息安全标准化技术委员会(SAC/TC260)提出并归口的国家标准草案,面向网联汽车数据处理者、监管机构及第三方测评机构,旨在规范采集数据在传输、存储和跨境等环节的安全要求。压缩包内仅包含1个PDF文档,大小248KB,但内容完整,涵盖范围、规范性引用文件、术语定义、基本要求以及数据传输、存储、跨境等具体条款。草案明确要求未经被收集者单独同意不得向车外传输包含个人信息的数据,座舱内音频视频图像数据不得外传,车辆位置轨迹数据在车内及远程信息服务平台中的保存时间均不得超过7天,车外环境数据与位置轨迹数据不得出境,行驶状态参数等如需出境应符合相关规定。这些条款直接关系到网联汽车产品的合规设计与监管评估,可作为企业自查、制度制定、标准学习和测评备案的原始参考资料,帮助读者快速掌握当前国家层面对汽车数据安全的底线要求。目前已有249人学习下载,适合信息安全、车联网、数据合规及相关监管领域从业者使用。
1. 网联汽车采集数据的安全要求:一份规范文档凭什么决定采集链路设计
网联汽车每天都在采集远超产品实际需要的数据。我们做某车型数据平台的合规改造时,一审采集清单就发现:行车记录仪原始帧、未参与算法训练的录像缩略图、售后诊断缓存,全都进了回传链路,没人定义过“该不该采、采了放哪”。这些失控数据,正是《信息安全技术 网联汽车 采集数据的安全要求》这份文档想管住的问题。
它从数据分类出发,把网联汽车采集的数据按属性拆成不同类别,再对采集、传输、存储、使用、删除每个环节给出安全要求。读下来你会发现它不像纯合规文档,更像一张产品需求清单:采了什么、为什么采、保留多久、谁能碰,每一步都要对上账。对车端嵌入式工程师、TSP 后端、测试人员和产品负责人,它既是验收底线,也是改造总纲。下面我按一条真实走过的实施路径,把分类、采集侧、传输存储、常见坑和验收方法讲透。
2. 数据分类是合规的地基:先把自己的数据字典建起来
我拿到这份安全要求后的第一件事,不是去配加密或者收紧权限,而是先整理数据字典。原因很简单:整套要求几乎都挂在分类上,分类错了,后面所有配置都会跟着错;分类对了,实现上即使有疏漏,审查线索也还在。
2.1 为什么安全要求都挂在分类上
网联汽车采集数据的业务面很宽,从车辆运行状态到乘员行为,从道路环境到精确位置,敏感性差异非常大。文档不会对全部数据套同一套要求,而是先通过分类把笼统的“采集数据”拆成有明确边界的子集,再按子集的风险决定控制力度。
我习惯从三个维度看分类。第一是数据主体:属于车辆本身、驾驶员或乘员,还是车外环境;第二是敏感程度:能否直接或间接识别到个人,是否包含精确位置、音视频、生物特征;第三是业务用途:是支撑行车安全的核心功能,还是增值服务,或者只是研发调试的临时数据。三个维度交叉之后,基本就能判断一个字段应该用哪一档保护。
最容易翻车的反而是那些“看起来不敏感”的数据。比如一段只拍车外道路的视频,初看不含个人隐私,但分辨率一高,路边行人面部和车牌一定会被带进去。这类“对外场景但实际夹带个人信息”的数据,分类时很容易被低估,等审查再返工成本很高。我经手的项目里对影像类数据一般都从紧处理,宁可先按较高敏感度设计,再根据实际用途逐项放行。
分类结论最终要落到一张字段级的数据字典上。这张字典是后面所有代码、配置、测试的共同参照,车端谁新增了采集字段,字典里没有,发布流水线就应该直接拦截。
2.2 字段级数据字典:从总线信号到存储策略的一条龙映射
建字典的步骤我一般分成四步。第一步,枚举数据源:把整车电子电气架构里的传感器、总线信号、T-Box 报文、第三方 SDK 回调全部拉出来,形成一份原始清单。第二步,给每个字段打上分类标记,并写明采集目的。第三步,把字典中的分类映射到安全要求,确定保留期、加密等级、访问角色和是否可导出。第四步,把字典接入发布流水线,任何新采集字段或采集范围变更都必须先过字典评审。
下面是一个我常用的模板结构,字段名和分类可以按自己车型调整:
# data_catalog.yaml —— 字段级数据字典模板 fields: - id: CAM_FRONT_RAW_001 source: front_camera_raw category: environment_video sensitive_level: L2 purpose: 驾驶辅助算法离线验证 minimal_required: true retention_days: 0 encryption: AES-256-GCM transmission: mTLS - id: GPS_TRACK_001 source: gnss_high_precision category: precise_trajectory sensitive_level: L3 purpose: 导航服务 minimal_required: false retention_days: 30 anonymization: grid_500m encryption: AES-256-GCM transmission: mTLS注意几个字段的用意。id 是跨版本稳定标识,不能随代码重构乱变;category 和 sensitive_level 一起决定安全档位;minimal_required 是关键钩子,字段不是最小必须时会被标记为 false,采集端默认不采集,只能靠事件或用户授权临时放行;retention_days 填 0 表示“不入库、用后即弃”,配合中间件在内存里处理完直接丢弃;anonymization 是扩展字段,用来登记脱敏策略,比如精确坐标落库前做 500 米网格化。
光有 YAML 还不够,建议再写一个校验脚本,让发布流程每次启动前都跑一遍。脚本逻辑不复杂:
# validate_catalog.py —— 校验采集配置与数据字典是否一致 import yaml def load_policies(path: str) -> dict: with open(path, "r", encoding="utf-8") as f: data = yaml.safe_load(f) return {item["id"]: item for item in data["fields"]} def check_capture(capture_fields: set, policies: dict) -> list: violations = [] for field in capture_fields: if field not in policies: violations.append(f"{field} 未登记数据字典") elif policies[field]["minimal_required"] is False: violations.append(f"{field} 非最小必须,不应默认采集") return violations这个脚本从配置中心读取当前版本定义的采集字段集合,再遍历数据字典校验。minimal_required 为 false 的字段如果出现在默认采集集合里,说明配置回退或者有人绕过字典直接加了字段,流水线直接红灯。参数细节上,capture_fields 建议用集合而不是列表,字段名不允许重复,集合能顺手把重复定义暴露出来。
按分类设置防护基线时,我常用下面这张表作为起步值,再按业务情况调整:
| 级别 | 典型数据 | 常用防护基线 |
|---|---|---|
| L1 | 车速、里程、电池电压 | 传输加密、访问控制 |
| L2 | 环境影像、路况视频 | 加密存储、限定用途 |
| L3 | 精确轨迹、含人脸车牌影像 | 脱敏、最短保留期、审批访问 |
| L4 | 生物特征、车内录音 | 默认不落库,本地处理,严格审批 |
有了这张表和字典,后续章节的采集、传输、存储配置才有依据。否则一上来谈加密和密钥管理,都是在半空中讨论。
3. 采集侧落地:最小化采集、用户同意与脱敏的工程实现
字典定了,接下来把规则落到车端。采集侧是整个链路里最难改的部分,因为嵌入式资源有限,没法靠后端补救,必须从源头控制。
3.1 最小化采集:把不该采的数据挡在源头
最小化采集不是“先全采回来再删”,而是在传感器和中间件层面就不生产多余数据。常见做法是双闸门:第一道闸门在源端,通过配置把不需要的采集通道直接关掉,比如摄像头只保留触发事件前后各 10 秒的缓冲带,事件之外的原始帧不落盘;第二道闸门在中间件层,根据数据字典做字段级过滤,只放行 minimal_required=true 的字段。
下面给一个中间件伪代码,说明整体口径:
# capture_filter.py —— 采集链路中间件伪代码 # 规则来自数据字典,字典缺失或配置异常时默认丢弃 policies = load_policies("data_catalog.yaml") enabled_sources = {"front_camera_raw", "gnss_high_precision", "can_bus"} # 源级开关 def on_sensor_frame(frame): if frame.source not in enabled_sources: return # 第一道闸门:源级关闭 allowed = {p["id"] for p in policies.values() if p["minimal_required"]} filtered = {k: v for k, v in frame.data.items() if k in allowed} policy = policies.get(frame.data_id) if policy and policy["retention_days"] == 0: process_in_memory(filtered) # 用后即弃,不落盘 else: enqueue_for_transmission(filtered)逻辑说明:第一道闸门在源级,后面的应用层逻辑根本收不到多余的包,这是最省 CPU 的方案。第二道闸门做字段裁剪,allowed 集合来自数据字典,如果某个字段没有登记,它同样不会被放行。retention_days 为 0 的字段走内存处理,比如在环视拼接里临时算一下碰撞概率,结果用完就丢。参数上要注意 enabled_sources 不要硬编码,应该由配置中心下发,否则每次改车型都要重新编译固件,容易出版本错位。
3.2 用户同意与授权状态:车机后端怎么联动
涉及个人相关数据采集时,用户授权不是“弹个窗”就结束,授权状态要能传导到采集源。车机端选中“同意脱敏后采集”,采集模块应实时切换策略,而不是等到下次启动才生效。
车机上一般会维护一个同意状态模块,常见的数据结构如下:
// ConsentStore.kt —— 车端同意状态持久化 data class ConsentRecord( val feature: String, // 功能标识,对应数据字典中的 purpose val level: Int, // 0=拒绝,1=仅脱敏采集,2=完整采集 val updatedAt: Long ) fun applyConsent(record: ConsentRecord) { when (record.level) { 0 -> disableSource(record.feature) 1 -> enableWithAnonymization(record.feature) 2 -> enableFull(record.feature) } }这段代码重点在 applyConsent 的实时切换:level=0 时直接关闭采集源,缓存里的旧数据也要同步清理;level=1 时打开脱敏开关;level=2 才允许完整采集。工程上容易漏的是 level=1 和 level=2 的切换,很多人只做了脱敏开关,忘记完整采集时也要有对应的原图通道,导致功能不可用,用户以为是 Bug。授权记录建议同步到 TSP 后端一份,统一作为审计证据,但车端本地也要留一份快照,保证断网时依然能按用户选择执行。
3.3 脱敏处理:人脸、车牌与精确位置的常用做法
脱敏位置的选择是个关键点。我见过不少方案把脱敏做在服务端,车端原图先传上云再处理,这等于把风险前置了。正确做法是把脱敏放进车端流水线,脱敏成功的数据才能进入存储和回传队列。
# anonymize.py —— 视频帧本地脱敏 def anonymize_frame(frame, mode="none"): if mode == "blur_face": boxes = detect_faces(frame) # 本地推理,不出设备 for b in boxes: frame[b.y:b.y+b.h, b.x:b.x+b.w] = gaussian_blur( frame[b.y:b.y+b.h, b.x:b.x+b.w], (35, 35), 0) elif mode == "mask_plate": plates = detect_license_plates(frame) for p in plates: frame[p.y:p.y+p.h, p.x:p.x+p.w] = 0 # 整块涂黑 return frame参数说明:gaussian_blur 的卷积核 (35,35) 是针对 1080p 帧调出来的,分辨率降到 720p 时可以改成 (23,23),太小会露出人脸轮廓。车牌掩膜用全黑而不是模糊,因为模糊在某些角度下仍能被恢复。detect_faces 和 detect_license_plates 应使用本地模型,建议选体积小、单帧推理时间小于 30ms 的模型,否则会影响视频管线帧率。
位置数据脱敏则走网格化或偏移。精确轨迹落库前按 500 米网格取整,保留到城市级粒度,既能支撑路况统计,又避免还原家庭住址。这里也要注意,网格化的原点必须是固定的,否则连续两帧坐标会落在不同网格边缘,产生跳变。
注意:脱敏参数不是一劳永逸,换摄像头型号或安装位置后,要重新标定人脸检测模型和模糊核大小。
4. 传输、存储与访问控制:把合规要求翻译成可配置参数
采集侧把数据控制住之后,接下来是数据在流转过程中的防护。这一章的内容大部分可以在后端和平台侧实现,也容易量化成参数表。
4.1 传输通道与证书体系:mTLS 落地细节
车端到平台的数据回传,常见做法是双向 TLS,也就是 mTLS。只做单向 TLS 只能保证链路加密,不能防止伪造车辆终端接入。mTLS 要求车端和服务器各自持有证书,互相验证身份,才能建立会话。
车端证书建议按 VIN 维度签发,私钥放进安全芯片或 HSM,不落明文磁盘。证书要有明确的用途限制,最常见的问题是证书用途过于宽泛,既能做 TLS 也能做代码签名,一旦私钥泄露危害面会很大。检查证书时我用 openssl 看两个信息:
# 检查车端证书有效期、用途与证书链是否可验证 openssl x509 -in device_cert.pem -noout -dates -purpose openssl verify -CAfile ca.pem device_cert.pem-dates 只看有效期,-purpose 会列出证书允许的使用场景,比如 SSL client。如果输出里没有 clientAuth,说明证书用途不对。verify 命令用于验证证书链,-CAfile 指向根证书文件。这里建议把证书链限制在两级,根 CA 离线保管,车端直接挂中间 CA 签发,避免根 CA 私钥暴露面过大。
证书轮换周期我建议 9 到 12 个月一次,但不要等过期才换,要通过 OTA 提前下发新证书,保留新旧证书并行期。换证书时要注意会话复用,避免正在回传数据的车辆因为证书更新被强制断链。
4.2 存储加密与密钥管理:密文、密钥与轮换策略
数据落库后加密是底线要求。常用的是 AES-256-GCM 或 SM4 算法。GCM 模式自带完整性校验,比 CBC 更适合有篡改检测需求的场景。
密钥管理比选算法更容易踩坑。我见过一个项目,数据库字段加密了,但备份文件是明文,运维随手一导,数据就出去了。正确做法是数据密钥和主密钥分离:数据密钥(DEK)由密钥管理系统生成并加密存储,主密钥放在 HSM 里,DEK 用主密钥解开后才能使用,业务侧拿不到原始主密钥。密钥轮换周期按数据敏感度分级:
| 密钥对象 | 用途 | 建议轮换周期 | 存放位置 |
|---|---|---|---|
| 数据密钥 DEK | 加密业务数据 | 90 天 | KMS + HSM |
| 存储主密钥 | 加密 DEK | 180 天 | HSM |
| mTLS 证书 | 车端与平台认证 | 9~12 个月 | SE / HSM |
这个表是起步值,安全要求更严格的话可以把 DEK 缩短到 30 天,但要评估频繁轮换带来的可用性开销。轮换不是重新加密全量数据,而是用新 DEK 加密新数据,旧 DEK 保留解密能力直到数据过期删除。备份文件同样按这套密钥体系加密,运维导出时必须经过 KMS 申请,否则拿到的是一串密文。
提示:备份通路必须与生产库使用同一套密钥体系,绝不能因为“备份是内部用”就降级为明文。
4.3 访问控制与审计日志:人员权限和留存查询
数据进了存储不等于任何人可读。访问控制按角色收敛权限,我常用的最小集是三类角色:业务使用角色只能查询脱敏后的数据集;开发调试角色只能在测试环境读样本数据,生产数据一律不给;合规审计角色可以查看审计日志但不能改日志。所有访问都走统一网关,而不是直连数据库。
审计日志是验收时的硬指标。日志字段至少要包含操作人、动作类型、数据范围、事由、时间。动作类型建议细分为 view、export、delete 三类,每类单独计数。下面是一个最简单的审计表结构:
CREATE TABLE access_audit ( id BIGINT PRIMARY KEY, operator VARCHAR(64) NOT NULL, -- 操作人工号/账号 action VARCHAR(16) NOT NULL, -- view / export / delete data_scope VARCHAR(256) NOT NULL, -- 涉及数据集标识 reason VARCHAR(128), -- 申请事由 created_at TIMESTAMP NOT NULL ); -- 月度合规自查:统计每类数据的导出次数 SELECT data_scope, COUNT(*) AS export_cnt FROM access_audit WHERE action = 'export' AND created_at >= date_trunc('month', now()) GROUP BY data_scope ORDER BY export_cnt DESC;SQL 里 data_scope 建议直接使用数据字典里的分类级别,这样审计结果能对应到安全分类上。审计日志本身要防篡改,常见做法是定期做哈希链,或者直接写入专门的审计存储,普通账号没有写入权限。
访问控制还有一个容易被忽略的角落:数据导出申请。凡是导出原始数据或 L3 级以上数据,都要走审批流,审批记录和导出动作必须能互相咬合。很多项目出事就出在“内部员工自己导数据自己审”,这条链路要断开。
5. 采集数据合规改造避坑:五个高频问题与处理记录
这一章不堆理论,只写我实际踩过的坑。每一条按现象、原因、解决三部分来记,读者可以直接对照自己的项目排查。
5.1 新版软件没过滤就回传旧字段
现象:字典评审通过、新固件发布后,某测试车还是回传了旧版本的敏感字段。翻日志发现这台车没有升级成功,还在跑旧固件;而后端网关没有按字典校验,看到能解密的字段就入库了。
原因:发布流水线只校验了新版本本身,没有管旧版本的存续行为。OTA 灰度期间,新旧固件长期并存,旧固件不认新字典,仍然按旧的采集配置上报。
解决:把校验从车端上移到平台网关,无论来自哪个版本,只要包含未登记字段就整包拒绝。车端 SDK 在上报包头带字典版本号,平台对低版本车辆标记待升级;在旧版本完成升级之前,平台对这类报文启用更严格的策略。
5.2 车机日志把敏感数据带进调试链路
现象:一次合规自查时,安全团队在故障诊断日志里发现了 GPS 坐标和一段视频缩略图路径。诊断工具是维修人员在排查问题时导出的,日志本身是明文。
原因:开发阶段为了方便调试,把数据对象直接打印进了日志;日志输出通道又是统一的,业务日志和调试日志混在一起。维修诊断开启调试模式后,这些数据就被带了出来。
解决:日志层增加脱敏过滤器,对所有含坐标、影像、人员标识的输出统一替换为哈希或网格值。调试日志默认关闭,开启需要临时授权,开启事件写入审计日志。这个改动看似小,却是最容易被忽视的泄露口。
5.3 脱敏做在云端的翻车现场
现象:某个需要视频分析的功能为了降低车端负载,把脱敏放到了云端任务队列。某次网络中断后,队列积压,运维手动补数据时把一批原始帧直接写入了对象存储,事后查到这批文件全是明文。
原因:脱敏流程依赖队列,队列一断,数据就旁路到存储。云端脱敏的风险在于“先落盘再处理”的结构,只要写入动作和脱敏动作不是原子操作,就有绕过窗口。
解决:把脱敏前移到车端完成,云端只接收脱敏后的数据。如果某些场景必须在云端处理,存储桶的写入权限要绑定到脱敏服务,业务账号不能直接写存储,所有绕过行为在权限层被禁止。
5.4 用户撤回授权后旧缓存还在
现象:用户从车机设置里关闭了某项采集授权,回传包里确实不再出现新数据。但平台第三天仍然收到了来自该车的历史报文,时间戳是关闭授权之前的。
原因:采集源被关闭了,但发送队列里的数据还在缓冲区里排队。授权状态变更只影响了“不再新采集”,没有清空“已采集未发送”的历史存量。
解决:授权状态变更要形成联动动作:关闭采集源的同时,清空发送队列、本地临时文件和相关目录缓存。已经上送到平台的数据,还要触发平台侧删除接口,按数据标识做强制删除。这条链路最好做成一个可测试的原子流程。
5.5 备份恢复后明文数据复活
现象:数据库加密配置都开了,一次容灾演练后,从备份恢复出来的数据却是明文。安全团队检查后发现,备份工具用的是文件系统快照,快照里的数据页在字段加密之外。
原因:加密机制只覆盖了应用写入路径,而快照拷贝的是底层数据文件。如果数据库做的是表空间加密,快照恢复后没有密钥仍然无法读取;但如果是字段级加密配合文件快照,快照本身可能包含明文。
解决:备份策略必须和加密策略对齐。推荐使用数据库原生加密备份,或逻辑导出后再加密,每次容灾演练增加一个“恢复后抽查是否明文”的验证项。备份介质本身也要纳入密钥管理体系。
这五条看着分散,但都指向同一件事:安全要求必须贯穿数据生命周期的所有路径,包括那些“临时”“调试”“恢复”路径。项目中每新增一个存储位置或导出通道,就按这个清单过一遍,大部分合规隐患都能提前挡掉。
6. 用合规测试矩阵验收改造:一个可复用的验证套路
改造做完不等于验收通过。要证明系统符合要求,最有效的方法是把分类与安全控制搭成矩阵,每条交叉点对应至少一个测试用例。
矩阵横向是采集、传输、存储、使用、删除五个环节,纵向是分类级别。比如 L3 级精确轨迹的删除验证:先在平台侧写入一条带特定标识的测试数据,调用删除接口,然后遍历主库、备份、缓存、日志和对象存储五个位置,确认没有任何残留。这个用例看起来简单,实际最容易卡住,因为备份恢复链路和日志系统往往不在删除逻辑覆盖范围内。
我一般会把验收脚本固定下来,每次版本迭代都重新跑。删除验证脚本的核心逻辑如下:
# verify_delete.sh —— 验证某条测试数据已从所有存储位置删除 # 参数:data_id 测试数据唯一标识 data_id=$1 for location in primary backup cache log object_storage; do if grep -r "$data_id" "$location" --quiet; then echo "FAIL: $location 仍存在残留" exit 1 fi done echo "PASS: 所有存储位置无残留"注意循环里的 location 不是随便列的,要把数据字典里映射到的每个存储位置都登记进去,否则漏掉备份目录会让删除验证失真。
除删除验证外,我还会优先做三类用例:一是字典一致性验证,用第 2 章的脚本检查采集字段集合;二是证书与加密参数验证,检查 mTLS 是否启用、证书用途是否正确、DEK 轮换记录是否存在;三是越权访问验证,用无权限账号尝试查询 L3 级数据,预期被网关拦截并生成审计日志。
这套验证做完,改造才算闭环。我个人的教训是:验收永远比开发更重要,别把“代码能编译、接口能调通”当成完成标准。数据合规改造里有大量看不见的路径,比如备份、调试日志、旧版本缓存,这些地方藏着最多的风险。每次版本发布前把矩阵用例跑一遍,花费时间可控,却能避免上线后返工。希望帮到你。
本文还有配套的精品资源,点击获取