嵌入式安全三要素:认证、完整性与保密性
很多工程师把“安全”等同于“加密”但在嵌入式系统中安全的优先级通常是身份认证数据完整性数据保密性。也就是说设备首先要确认对方是否可信数据是否被改过数据内容是否需要隐藏。只有前两个问题解决之后保密性设计才有实际意义。关键词工程含义认证 / 完整性 / 保密性先确认对方可信和数据可信再决定是否需要隐藏数据内容。1. 为什么不能把安全简单理解为加密在嵌入式系统中很多人一提到安全第一反应就是加 AES通信数据不要明文固件内容加密协议字段做混淆。这些措施确实可以提高安全性但它们并不等于完整的安全设计。因为加密主要解决的是“别人能不能看懂数据”而很多实际攻击并不是从“看懂数据”开始的而是从下面这些问题开始的对方是不是合法设备这条命令是不是合法控制器发出的固件有没有被篡改配置参数有没有被偷偷修改这包数据是不是以前截获后重放的这个耗材、探头或电池是不是真的所以在嵌入式安全中通常应该先考虑身份认证和完整性再考虑保密性。2. 身份认证 Authentication身份认证用于确认通信对象或设备确实是它声称的对象。通俗地说认证要解决的问题是你是谁你能不能证明你就是你在嵌入式产品中认证常见于以下场景主机判断接入的传感器是否合法主机判断耗材、探头、电池是否为原厂或授权部件设备判断云端服务器是否可信设备判断升级包是否来自合法发布方网关判断接入的子设备是否可信产线系统判断设备是否为合法生产对象。如果没有认证攻击者可以伪造一个设备。即使后续通信使用了加密也可能只是和攻击者建立了一条**“加密但不可信”**的通道。3. 没有认证时加密也可能失效一个常见误区是只要通信加密了就安全了。但如果设备没有先确认对方身份加密通道本身也可能建立在错误对象之上。例如主机通过某个接口连接传感器。如果攻击者伪造了一个传感器并且主机没有认证机制那么主机可能会直接和这个假传感器通信。此时即使通信过程中使用了 AES结果也只是主机和假传感器之间建立了一条加密通道。数据确实被加密了但对方身份并不可信。所以认证是很多嵌入式安全设计中的第一步。4. 完整性 Integrity完整性用于判断数据是否被修改。它要解决的问题是数据在传输、存储或升级过程中有没有被改过在嵌入式系统中需要完整性保护的数据很多例如固件镜像Bootloader配置参数校准参数控制命令日志记录测量数据生产序列号设备证书升级包元数据。如果没有完整性保护攻击者可能修改固件、配置或通信命令从而让设备执行错误逻辑。5. Hash、MAC 和数字签名的区别完整性保护常见手段包括 Hash、MAC 和数字签名。它们的作用不同工程上不能混用。方法主要作用是否能证明来源典型用途Hash判断数据有没有变化不能文件校验、固件摘要MAC判断数据有没有变化并证明发送方知道共享密钥可以前提是共享密钥安全通信报文认证、挑战响应数字签名判断数据有没有变化并证明来自私钥持有者可以固件签名、证书链、安全升级5.1 HashHash 可以发现数据变化。例如对固件计算 SHA-256 摘要只要固件内容发生任何变化摘要结果就会不同。但 Hash 本身不能证明数据来自合法发送方。原因是攻击者如果能够修改固件也可以重新计算一个新的 Hash。所以Hash 更适合用于普通校验、摘要计算不能单独作为安全认证手段。5.2 MACMAC也就是消息认证码。它不仅能判断数据有没有被修改还能证明发送方知道某个共享密钥。例如主机和设备内部都保存同一个密钥。发送方对消息计算 MAC接收方用同一个密钥验证 MAC。如果验证成功说明数据没有被修改发送方大概率持有正确密钥。因此MAC 常用于设备认证、挑战响应和通信报文完整性保护。5.3 数字签名数字签名基于非对称密钥体系。发布方使用私钥对固件或数据摘要进行签名设备端使用公钥验证签名。数字签名适合用于固件安全启动OTA 升级包校验证书链验证生产授权文件验证。它的优势是设备端只需要保存公钥不需要保存发布方私钥。即使设备被攻击者拿到也不应该能伪造合法签名。6. 保密性 Confidentiality保密性用于防止数据被窃听者读取。它要解决的问题是这条数据被别人看到会不会造成风险保密性适用于敏感数据例如医疗数据用户身份信息密钥材料商业机密算法参数生产授权信息设备内部诊断数据某些专有协议内容。常见保密性手段包括对称加密例如 AES非对称加密会话密钥TLS / DTLS安全存储加密 Flash加密升级包。7. 不是所有数据都必须加密不是所有命令都必须加密。例如打开灯查询版本号读取普通状态设置非敏感工作模式。这些数据内容本身可能并不敏感即使被别人看到风险也不大。但是这并不代表它们不需要安全保护。对于控制命令来说更重要的问题通常是命令是不是合法控制器发出的命令有没有被篡改命令是不是历史数据重放命令是否在允许的权限范围内也就是说有些数据不一定需要保密性但一定需要认证、完整性和防重放保护。8. 工程判断方法判断一条消息是否需要加密时不要先问能不能加 AES而应该先问三个问题8.1 这条消息需要证明来源吗如果需要证明来源就要考虑设备认证消息认证挑战响应MAC数字签名证书机制。8.2 这条消息被篡改会不会有风险如果被篡改会造成风险就要考虑完整性校验MAC数字签名安全计数器防回滚防重放机制。8.3 这条消息内容被别人看到是否有价值如果内容被看到会造成风险就要考虑数据加密会话密钥密钥协商安全存储TLS / DTLS加密升级包。前两个问题通常决定认证和完整性第三个问题才决定保密性。9. 工程示例示例 1固件升级包固件升级包通常至少需要完整性保护发布方身份认证防回滚机制。如果固件内容涉及算法、协议或商业机密还需要考虑加密。也就是说固件升级包并不是“只加密”就安全关键是要验证这个固件是不是官方发布的这个固件有没有被篡改这个固件是不是允许安装的版本示例 2耗材认证耗材认证的核心通常不是“数据是否保密”而是这个耗材是不是真的它是不是被复制出来的它有没有被重复使用或非法复位因此耗材认证通常需要唯一身份挑战响应共享密钥或非对称认证安全计数器防重放机制。示例 3普通控制命令例如“打开灯”这样的命令内容本身并不敏感。但是如果攻击者可以伪造这条命令系统仍然存在风险。所以它可以不加密但应该保证命令来自合法控制器命令没有被篡改命令不是历史数据重放命令在当前状态下允许执行。10. 工程总结加密只是安全的一部分。真正可靠的嵌入式安全系统必须先解决两个更基础的问题身份可信数据可信。然后再根据数据价值决定是否需要隐藏内容。简单来说认证解决“你是谁”完整性解决“数据有没有被改”保密性解决“别人能不能看懂”。在嵌入式产品中安全设计的优先级通常不是先加密再考虑其他。而应该是先认证身份再保护完整性最后根据需要保护保密性。