汽车网络安全 - 会话密钥实现OTA的设备认证

一、会话密钥

汽车电子会话密钥在汽车电子系统中起着至关重要的作用,主要在OTA升级过程中的作用:

1、安全通信加密

防止数据泄露:在汽车内部网络中,不同电子控制单元(ECU)之间需要进行大量的数据交互,或者ECU与外部加密芯片的通讯。会话密钥用于对这些数据进行加密,使传输的数据变成密文形式。即使数据在传输过程中被截取,没有正确的密钥也无法解密获取其中的内容,从而保护了车辆的敏感信息(如OTA升级的验签密钥)不被泄露。

2、身份认证

服务器或诊断仪设备接入认证:当汽车与外部设备(诊断仪)进行连接时,也需要使用会话密钥进行身份认证。例如,当ECU需要OTA升级时,汽车和诊断仪会使用预先共享的密钥或通过密钥协商机制生成会话密钥,然后利用该密钥进行身份验证和数据加密传输,确保只有授权的设备才能与汽车进行通信,保护用户和车辆的安全。

二、会话密钥 - 算法

1、ECDHE算法

ECDHE(Elliptic Curve Diffie - Hellman Ephemeral)即椭圆曲线临时 Diffie - Hellman 算法,它是基于椭圆曲线密码学的一种密钥交换协议,属于 Diffie - Hellman 密钥交换算法的变体,它利用椭圆曲线的数学特性,在不安全的通信信道上,使通信双方能够安全地协商出一个共享密钥,常见的椭圆曲线有 NIST P - 256、Curve25519 。
ECDHE具体原来参考如下:
https://www.cnblogs.com/xiaolincoding/p/14318338.html

2、KDF算法

KDF 即密钥派生函数(Key Derivation Function),是密码学里的关键工具,其用途是从给定的初始密钥材料(如密码、主密钥等)派生出一个或多个密钥,主要用途如下。

2.1、密钥扩展

在某些场景下,输入的密钥材料可能长度不足或不适合直接使用,KDF 可将其扩展为满足需求的密钥长度。

2.2、密码存储

当需要存储用户密码时,不直接存储明文密码,而是使用 KDF 函数对密码进行处理后存储,提高安全性。

2.3、生成会话密钥

在通信双方建立安全通信时,可使用 KDF 从共享的密钥材料派生出会话密钥

2.4、KDF不同Option说明

表1、表2和表3列举了辅助函数H的可能性,并提供了有关相关参数值的附加信息,例如H_outputBits和max_H_inputBits。表格还指出了在SP 800-56A或SP 800-56B中指定的密钥建立方案的密钥派生函数中,H的每种选择所支持的安全强度范围参考NIST SP 800-56C 4.1章节。KDF常用Option 1方式,HASH选择SHA-256。Option方式分别如下:

Option 1

在这里插入图片描述

Option 2

在这里插入图片描述
建议对所选盐的长度没有限制,除了要求其字节长度大于零,但不大于用于实现hmac哈希的哈希函数hash的单个输入块的长度。然而,这种选择的自由在某种程度上是虚幻的,因为HMAC算法会将输入的盐值(根据需要)转换为指定的依赖于哈希长度的字符串。一个较短的salt(被H用作HMAC密钥)将通过附加一个全零位字符串来填充,以获得指定长度的字符串(哈希函数的单个输入块的长度,hash);一个较长的salt将被散列以产生一个较短的字符串(位长度为H_outputBits),然后将其填充(通过添加一个全零位字符串)以获得指定长度的字符串(参见[FIPS 198]了解更多信息)。

Option 3

在这里插入图片描述

三、会话密钥如何实现设备认证

在这里插入图片描述

四、会话密钥的验证脚本实现

#pip install cryptography 如何脚本执行错误,需要执行此命令安装一下

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.serialization import Encoding, PublicFormat

# 选择椭圆曲线,这里使用 SECP256R1
curve = ec.SECP256R1()

# 生成 Alice 的私钥和公钥
alice_private_key = ec.generate_private_key(curve)
alice_public_key = alice_private_key.public_key()

# 生成 Bob 的私钥和公钥
bob_private_key = ec.generate_private_key(curve)
bob_public_key = bob_private_key.public_key()

# Alice 从 Bob 那里获取公钥,计算共享密钥
alice_shared_secret = alice_private_key.exchange(ec.ECDH(), bob_public_key)
# 使用 HKDF 对共享密钥进行派生,增强安全性
alice_derived_key = HKDF(
    algorithm=hashes.SHA256(),
    length=32,
    salt=None,
    info=b'handshake data',
).derive(alice_shared_secret)

# Bob 从 Alice 那里获取公钥,计算共享密钥
bob_shared_secret = bob_private_key.exchange(ec.ECDH(), alice_public_key)
# 使用 HKDF 对共享密钥进行派生,增强安全性
bob_derived_key = HKDF(
    algorithm=hashes.SHA256(),
    length=32,
    salt=None,
    info=b'handshake data',
).derive(bob_shared_secret)

# 验证双方计算出的派生密钥是否相同
assert alice_derived_key == bob_derived_key
print("双方计算出的派生密钥相同,密钥交换成功!")
print(f"派生密钥: {alice_derived_key.hex()}")
    

五、会话密钥的嵌入式软件实现

ECU端软件实现暂未开发完成,待后续完成后,补充说明

总结

提示:这里对文章进行总结:

会话密钥主要用于设备认证,避免非授权的设备访问ECU,导致ECU程序被破坏。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值