关于蓝牙安全性的话题
撰写于:2015年9月30日
作者:silex Wi-Fi专家
蓝牙的安全性
蓝牙的安全机制与 WiFi 既有相似之处,也有不同之处。WiFi 的安全性原则上是在接入点和从设备之间进行设置的(※注),而蓝牙则是在主设备(主机)和从设备之间进行设置。为了确保安全,蓝牙的主机和从机需要相互注册并交换、保存密钥,这个过程被称为 “配对”。配对是蓝牙安全中的核心概念。
※注:不过,若使用 WiFi 企业级安全功能,安全管理通常会集中在接入点之外的 RADIUS 服务器上 。蓝牙并不存在与企业级相对应的安全概念。
在 WiFi 的情况下,在旧的 WEP标准中,是 “按每个接入点” 来设置加密密钥的。然而,所有从设备都使用相同的加密密钥进行通信存在一个缺陷,即这会使密码破解变得容易。在后来的 WPA/WPA2 标准中,改为以每个接入点设置的密钥(PSK,即预共享密钥)作为原始信息,为每个从设备动态生成并使用不同的加密密钥(PTK)。
在蓝牙加密中,和 WiFi 的 WPA 一样,不同的主设备之间会使用不同的加密密钥。在蓝牙经典(Bluetooth Classic)模式下,这个密钥被称为 “link key”(下文称为“链路密钥”),而在蓝牙低功耗(Bluetooth LE)模式下则被称为 “LTK(Long Term Key)” 。蓝牙没有与 WiFi WPA 的 PSK 相对应的 “用户设置的密码”,而是在配对设置时,由主设备和从设备之间动态生成密钥(※注)。在某些情况下,此时还会对 “交换的密钥是否正确(在通信路径上密钥未被第三方替换)” 进行验证(认证)。
“通过配对操作进行加密密钥交换” 以及 “在配对时可选择进行认证” 这一基本概念在蓝牙经典(Classic)模式和蓝牙低功耗(LE)模式下都是通用的。
※注:实际上,在旧的 PIN 模式配对中,定义了 “单位密钥(Unit Key)” 和 “组合密钥(Combination Key)” 这两种方式。其中,在单位密钥方式下,配对时不进行伪随机数交换,因此加密密钥近乎静态(Core Spec 4.2 Vol.2 Part.H 3.2.3)。不过,PIN 模式已被认定为过时,而单位密钥更是早就被声明弃用,所以这不过是 “过去曾有过这类东西” 的一段历史罢了。
当配对成功后,通常主设备(Master)与从设备(Slave)之间的密钥(链路密钥)会被存储在一个难以从外部读取的区域(一般认为如此)。下次通电时,设备会读取存储的链路密钥进行通信,因此一旦配对成功的设备(除非清除设置)在下次通电时理论上只需开机即可连接和使用。
实际上,在蓝牙的规格说明书中,“配对” 这一术语指的是 “密钥交换协议的执行”,而 “交换后密钥的保存” 则用 “绑定(Bonding)” 这一术语来加以区分(参见Core Spec 4.2 Vol.3 Part.C 16.5)。然而,这种区分仅仅是在规格说明书中用于区分协议和步骤的说明,在实际操作产品时,执行绑定的行为通常仍被称为 “配对”。在蓝牙规格说明书中,根据上下文,“配对” 这个词有时也兼有 “绑定” 的意思,这在阅读规格说明书时很容易造成混淆。在本专栏中,原则上,包括绑定的含义在内,我们使用(大家更为熟悉的)“配对” 这一术语。
在蓝牙经典版的情况下
蓝牙经典的安全规格在Core Spec 4.2 Vol.3 Part.C 5.2.1中被定义为从模式1到模式4的“安全模式”。
模式1:非安全模式(Non-Secure)
这是一种无安全保护的模式。既无认证也无加密。
模式2:服务级强制安全(Service level enforced security)
连接时不要求安全性,但在数据通信时,会根据需要进行认证和加密。
模式 3:链路级强制安全
连接时进行认证和加密。简而言之,这是一种无论进行何种操作都必须进行配对的模式。
模式4:服务级强制安全
根据使用情况进行认证与加密。例如,服务搜索(SDP)响应不要求安全性,但对于数据通信则要求具备安全性。
像这样,从通信规范上来说,蓝牙经典版也定义了 “无需配对” 的使用方式(模式 1),而且如果使用 BlueZ 等协议栈,实际上也能够在未配对的 L2CAP 或 RFCOMM 会话中进行通信。
然而在现实中,几乎所有蓝牙产品都是以模式 4 来实现。模式 1 和模式 2 仅仅是为了保持与蓝牙2.0 之前版本的兼容性才保留下来的,因为自蓝牙 2.1 起,蓝牙产品就被强制要求采用模式 4 来实现。
在模式 4 下,还进一步定义了五个等级的 “安全级别”(参见Core Spec 4.2 Vol.3 Part.C 5.2.2.8) 。
等级0:无安全性要求,无需用户操作
等级1:无安全性要求,需要用户操作
等级2:有加密,无认证
等级3:有加密,有认证
等级4:有高强度加密,有认证
在这些等级中,等级0 的使用仅限于安全性反而会带来不便的场景,比如 SDP 服务搜索。等级1和等级0的区别不太容易理解,但查看表 5.8 就会发现,1 级即便无需认证,也要求建立链路密钥,这应该理解为用于与已完成配对的对象进行无加密通信的场景(如连接前的步骤等)。
简而言之,在蓝牙经典版中,虽然从规范层面定义了无需加密(配对)的通信流程,但实际上,对于产品而言,配对是必不可少的。从技术角度来说,实现无加密通信是可行的,然而,这样做不符合蓝牙规范要求,无法通过蓝牙认证程序,也就不能作为产品进行销售。
蓝牙经典版配对详情
蓝牙经典版的配对是在名为 LMP(链路管理协议,Link Management Protocol)的层级实现的。LMP 位于 ACL 之上,通过 ACL 数据包的LLID 值为 3 来识别(LLID = 1 或 2 对应 L2CAP)。
蓝牙经典版的配对方式包括蓝牙2.0及更早版本的“PIN码模式”和2.1及以后版本的“SSP(简单安全配对,Simple Secure Pairing)模式”。在上述“安全模式”中,模式2和模式3对应PIN码模式,而模式4则对应SSP模式。
PIN码模式是通过输入最多 16 位数字的密码进行认证的模式。不过,其加密方式基于简单的哈希交换,且许多蓝牙产品将其实现为固定的4位代码(如“0000”、“1234”、“9999”等),所以很容易被暴力破解,目前被认为是不安全的。如前文所述,PIN 码模式已被视为过时(Obsolete),仅在规范中保留以确保与早期销售产品的兼容性。
SSP 模式采用 ECDH(椭圆曲线迪菲 - 赫尔曼)算法的公钥交换方式,提升了对窃听的安全性。此外,为应对中间人攻击者替换公钥的 “MoM 攻击”,该模式支持多种认证方式(参见Core Spec 4.2 Vol.2 Part.F 4.2.9及后续内容)。
- Just works(默认配对):无需认证。用于鼠标、耳机等既无法进行输入也无法显示信息的设备。
- Passkey Entry(密码输入):在主机端显示的“密码”需要在设备上输入以完成认证。用于键盘等仅具备输入功能的设备。
- Numeric comparison(数字比较):在设备端显示的“认证代码”与主机端的显示进行比较,确认是否一致。适用于仅具有显示功能的设备,如相机、打印机等。
- Out Of Band(OOB,带外认证):利用USB、NFC等非蓝牙通信手段进行认证。现实中实现该技术的产品极为稀少。
这些认证模式会根据主机与设备的显示及输入能力(IO Capability)的组合,选择合适的方式进行。在操作上,“Passkey entry(通行密钥输入)”虽然与PIN码方式相似,但其内部采用的是完全不同的协议。此外,由于每次都会随机生成6位以上的数字作为密码,因此相较于PIN码方式,它更难受到已知明文攻击或暴力破解的威胁。
在实际的数据包加密中,在蓝牙 4.1及之前的规范使用的是名为E0的加密算法。而在后来制定的蓝牙低功耗(Bluetooth LE)中,采用了更为强大的AES-CCM加密技术。自蓝牙 4.2起,这一AES-CCM加密技术也被扩展为蓝牙经典版的可选加密方式(参见Core Spec 4.2 Vol.2 Part.H 9)。无论是哪种情况,都不会直接将链路密钥用作加密密钥,而是通过交换的伪随机数和链路密钥生成的动态伪随机数来作为加密密钥使用。
蓝牙低功耗的情况下
蓝牙低功耗(Bluetooth LE)在配对和加密密钥的保存方式上的概念与经典蓝牙经典版有许多共通之处,但由于术语定义的差异以及相似词汇在不同上下文中的意义不同,容易造成混淆。
蓝牙低功耗中存在着“安全模式”和“安全等级”的概念,其中模式分为1和2两种,每种模式下又定义了若干级别的“等级”(参见Core Spec 4.2 Vol.3 Part.C 10)。需要注意的是,这里所说的“安全等级”与蓝牙经典版中GAP安全模式4下的“安全等级”含义不同,这一点需格外留意,确实颇为复杂。
低功耗蓝牙安全模式 1:
等级1:无安全保护
等级2:加密但无认证的配对
等级3:加密且有认证的配对
等级4:使用低功耗蓝牙安全连接的配对
低功耗蓝牙安全模式 2:
等级1:无认证的配对+数字签名
等级2:有认证的配对+数字签名
模式2中的“数字签名(Data Signing)”功能,与其说是蓝牙低功耗的功能,不如说是蓝牙低功耗标准格式——属性协议(ATT)的功能(参见Core Spec 4.2 Vol.3 Part.F 3.3.1)。这一功能特别适用于需要快速连接、断开和传输的服务(参见Core Spec 4.2 Vol.3 Part.C 10.2.2),并且原则上定义为在无加密状态下使用(参见Connection Signature Resolving Key)。为了进行数字签名,除了加密和认证之外,还准备了一种称为CSRK(Connection Signature Resolving Key,连接签名解析密钥)的密钥,通过配对时的“Sign”标志来额外交换CSRK(参见Core Spec 4.2 Vol.3 Part.H 3.5.1及以后内容)。
在蓝牙低功耗中,加密(≈配对)的必要性是根据服务的性质来定义的(参见Core Spec 4.2 Vol.3 Part.C 10.3.1)。在接收GATT协议的请求这一步是无条件的,而在处理并返回响应时,会根据所请求属性的安全要求(ATT级别的Permission属性,参见Vol.3 Part.F 3.2.5)来决定处理方式(表10.2/图10.1)。这就是前面提到的“根据需要”的判断条件(※注)。
※注:这部分确实与SNMP有些相似,但与后来添加了安全结构的SNMPv3的安全MIB(USM(用户安全模型)/VACM(基于视图的访问控制模型))相比,后者变得极其复杂,而从一开始就将安全属性整合到属性结构中的ATT则更为简洁易懂。
Permission 属性包含Encryption(加密)、Authentication(认证)、Authorization(授权)三种,每种都有Not Required(非必需)和Required(必需)的组合。Permission 属性与Security Mode/Level(安全模式/等级)之间的对应关系,在蓝牙规范文档原文中并未进行汇总。若一定要总结的话,如下表所示。
不需要加密 | 需要加密 | |
无需认证 | 模式1 等级1 | 模式1 等级2 |
需要认证 | 模式2 等级1/2 | 模式1 等级3/4 |
在图10.1/10.2中,仅提到在“无需安全措施(security not required)”的情况下使用“级别 1”,在“无需加密(Encryption Needed=No)”的情况下使用“模式 2”,而对于模式 2中级别 1 和级别 2 的使用区别并未明确说明。在“无需加密(Encryption Not Required)”+“需要认证(Authenticaiton Required)”的情况下,似乎指的是需要认证的配对,即模式 2 级别 2 。然而,在Core Spec 4.2 Vol.3 Part.C 10.4 中有这样一段描述:“数字签名用于在未加密的连接中传输经过认证的数据(※注)”,这似乎可以理解为数字签名本身被视为一种认证方式。这样一来,模式 2 中级别 1 和级别 2 的区别就变得模糊了,但规范中并未给出明确的解释。
※注:数字签名用于在未加密的连接中在两台设备之间传输经过认证的数据。
此外,Authorization(授权)被定义为“需要用户介入来确认是否继续操作”,似乎与协议层面的加密/认证无关(参见Core Spec 4.2 Vol.3 Part.C 10.5)。
蓝牙低功耗配对
与蓝牙经典版不同,蓝牙低功耗没有 LMP 层,其安全性在一个称为Security Manager(安全管理器)的层级进行定义(参见Core Spec 4.2 Vol.3 Part.H)。在蓝牙经典版中被称为 “链路密钥” 的加密密钥,在蓝牙低功耗中被称为LTK(Long Term Key,长期密钥)。有了LTK,也就有了STK(Short Term Key,短期密钥),STK 指的是在 LTK交换过程中使用的一种临时加密密钥。
在蓝牙低功耗 4.1之前的配对方式与蓝牙经典版的SSP类似,但协议采用了基于哈希的简化方法,并且没有Numeric Comparison(数值比较)认证选项。这种简化的密钥交换方式在蓝牙低功耗规范发布后不久就被批评为存在安全漏洞。因此,从4.2版本开始,新增了使用与SSP相同的ECDH算法的“LE Secure Connections(低功耗蓝牙安全连接)”配对方式。这使得4.1之前的配对方式被称为“LE Legacy Pairing(低功耗蓝牙传统配对)”(参见Core Spec 4.2 Vol.3 Part.H 2.3.5)。
蓝牙低功耗随机地址
在蓝牙低功耗规范中,主机/设备的角色被定义为“Broadcaster(广播者)”、“Observer(观察者)”、“Peripheral(外围设备)”和“Central(中心设备)”,并为每个角色规定了相应的安全要求(Privacy Feature)(参见Core Spec 4.2 Vol.3 Part.C 10.7)。在这里频繁使用的“绑定(Bonding)” 和 “可绑定(Bondable)”等术语,正如开头所提到的,指的是“执行配对过程并存储交换的密钥”这一行为(参见Core Spec 4.2 Vol.1 Part.A 5.1)。
在10.7节中,“Private Address(私有地址)”这一术语频繁出现。私有地址是蓝牙低功耗扩展的一项安全功能,它允许设备在通信时不使用设备固有的物理地址(Public Address),而是使用动态生成的随机地址。这种模式的目的可能是为了避免通过固定物理地址追踪设备及推测密钥信息,以及防止DoS攻击等安全问题。
在蓝牙低功耗中,可以使用两种类型的地址:“Public Address(公共地址)”和“Random Address(随机地址)”。而随机地址又进一步分为三种类型:“Static Device Address(静态设备地址)”、“Non-Resolvable Private Address(不可解析私有地址)”和“Resolvable Private Address(可解析私有地址)”(参见Core Spec 4.2 Vol.6 Part.B 1.3.2)。究竟为什么要定义这三种看似相似却又不同的地址,以及在何种情况下分别使用它们,由于规范中没有系统的总结,因此非常难以理解。不过,简单概括如下:
Random Static Address(最高两位,2 比特 = 11)
这是一种在每次设备通电时生成的随机地址。只要设备没有重新通电,这个地址就不会改变。它可以用来替代设备固有的物理地址(Public Address)。在这种情况下,“Public Address”或“Random Static Address”被统称为“Identity Address(标识地址)”。
Non-Resolvable Private Address(最高两位2 比特 = 00)
这是一种动态生成的随机地址(※注)。
Resolvable Private Address(最高两位 2 比特 = 10)
这是一种动态生成的随机地址(※注)。它在配对时基于交换的密钥(IRK,Identity Resolving Key,身份解析密钥)生成。接收方可以使用IRK来验证(解析)该地址的合法性。
※注:Private Address的重新生成间隔建议为15分钟(参见Core Spec 4.2 Vol.6 Part.B 6.1)。
私有地址中Non-Resolvable(不可解析)和Resolvable(可解析)的使用区分似乎有些模糊,但查看 Core Spec 4.2 Vol.3 Part.C 10.7 可以发现,要声称支持“Privacy Features(隐私功能)”
- 对于 Central/Peripheral而言:必须实现Resolvable Private Address,Non-Resolvable Private Address是可选的。
- 对于 Broadcaster/Observer而言:必须实现 Resolvable Private Address 或 Non-Resolvable Private Address 中的任意一种。
定义似乎就是如此。总感觉呢…… 是不是想得太复杂了。虽然初衷可能是为了根据使用条件提供多种选择,但准备两三种相似但不同的东西,往往会导致不必要的实现混乱呢。
总结
将以上内容整理成要点如下。
蓝牙经典版的情况:
?配对和加密:作为产品,配对(即加密)的实现是必需的。虽然从规范上来说,非加密通信也是可行的,但采用这种方式的产品无法通过产品标识认证。
· 配对方式:存在 PIN(2.0 版本以前)和 SSP(2.1 版本及以后)两种配对方式。不过,PIN 实际上已被废弃,仅为了兼容性而保留。
· SSP模式:在 SSP 模式下,分为 JustWorks(无需认证),或者带有Passkey Entry、Numeric Comparison、OOB的配对认证方式。
· 加密算法:使用E0加密算法,从4.2版本开始,作为可选方案增加了 AES - CCM 加密算法。
蓝牙低功耗的情况:
· 配对与加密需求:是否需要配对和加密取决于设备的角色(Broadcaster、Observer、Peripheral、Central)以及属性的隐私特性(Privacy Feature)。
· 配对方式:蓝牙低功耗有两种配对方式,分别是LE Legacy(4.1及以前版本)和LE Secure Connections(4.2及以后版本)。
· 配对认证:配对认证方式与蓝牙经典版基本相同,但LE Legacy Pairing不支持Numeric Comparison。
· 加密算法:蓝牙低功耗使用AES-CCM进行数据加密。
· 隐私功能:在实现 “Privacy Feature” 的情况下,通过使用随机数地址,可将物理地址的暴露程度降至最低。
把这些内容整理出来之后,看起来似乎很简单,但从规格书原文(Bluetooth Core Spec 4.2,正文 2772 行,PDF 大小为23.8MB)中解读出来却并不容易。这次我们非常详细地标注了规格书原文的出处,这其中包含了“不要只依赖网上的二次解读,努力去读规格书原文吧!”的意图。
相关文章
Silex 产品信息
我们的技术和产品旨在建立设备之间的通信,并确保这种通信能够顺畅地稳定进行。而且,更重要的是,使用 Silex 技术和产品的客户可以绝对放心。 我们正是致力于实现这一目标。